同步对象的区别与联系

来源:互联网 发布:4g通信模块数据发送 编辑:程序博客网 时间:2024/04/30 04:29

同步对象之间的区别

 MFC对象:CSemaphore/CMutex/CCriticalSection/CEvent区别

临界区:临界区是一种最简单的同步对象,它只可以在同一进程内部使用。它的作用是保证只有一个线程可以申请到该对象。 
         互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
         互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以我们可以使用WaitForSingleObject来等待进程和线程退出。
  通过互斥量我们可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,你的老板会要求你根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。
         事件,前面讲的信号灯和互斥量可以保证资源被正常的分配和使用,而事件是用来通知其他进程/线程某件操作已经完成。

如果某个线程必须等待某些事件发生后才能存取相应的资源,用CEvent;
如果一个应用同时可以有多个线程存取相应资源,用CSemaphore;
如果有多个应用(多个进程)同时存取相应资源,用CMutex,否则用CCriticalSection

WIN32 API对象:互斥对象与关键代码段的比较

互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。 
关键代码段是工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值

就等待线程的调度而言,互斥对象与关键代码段之间有着相同的特性。但是它们在其他属性方面却各不相同。表1对它们进行了各方面的比较。

表1 互斥对象与关键代码段的比较

特性互斥对象关键代码段运行速度慢快是否能够跨进程边界来使用是否声明HANDLE hmtx;CRITICAL_SECTION cs;初始化h m t x = C r e a t e M u t e x(N U L L,FA L S E,N U L L);I n i t i a l i z e C r i t i c a l S e c t i o n ( & e s );清除C l o s e H a n d l e(h m t x);D e l e t e C r i t i c a l S e c t i o n(& c s);无限等待Wa i t F o r S i n g l e O b j e c t(h m t x , I N F I N I T E);E n t e r C r i t i c a l S e c t i o n(& c s);0等待Wa i t F o r S i n g l e O b j e c t Tr y(h m t x , 0);TryE n t e r C r i t i c a l S e c t i o n(& c s);任意等待Wa i t F o r S i n g l e O b j e c t(h m t x , d w M i l l i s e c o n d s);不能释放R e l e a s e M u t e x(h m t x);L e a v e C r i t i c a l S e c t i o n(& c s);是否能够等待其他内核对象是(使用Wa i t F o r M u l t i p l e O b j e c t s或类似的函数)




1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 

用自己的语言总结一下, 


互斥量是信号量的一个特例,信号量的引用计数为n,而互斥量为1,信号量有一个等待队列,当信号量引用计数大于0时就唤醒等待队列上的线程可以访问资源; 


临界区是你需要用信号量,互斥量或锁保护的一段代码,避免多个线程并发的访问处于同一个临界区中的资源; 


事件有可中断和不可中断事件,主要用于唤醒睡眠中的线程好像是这样的,记不清了
0 0
原创粉丝点击