同步控制

Critical Sections
   特点:速度快,可重入。
             存在与进程的内存空间,非核心对象,因此不能使用wait..., 不能跨进程, 也不能同时等待多个critical section,不能指定等待时间。
              
   不要在一个critical section 中调用Sleep, Wait.., 或者是同步切换到其他线程,例如SendMessage到主线程,
   如果其他线程此时要进入该critical section就会造成死锁。

   获取多个Critical Section时要格外小心,  
          EnterCriticalSection(Section1)
          EnterCriticalSection(Section2)
          ...
          LeaveCriticalSection(Section2)
          LeaveCriticalSection(Section1) 
   所有调用的地方都要保持同样的调用次序和释放次序 

   API: InitializeCriticalSection
          DeleteCriticalSection
          EnterCriticalSection
          LeaveCriticalSection

Mutex
     特点: 内核对象,只允许一个线程拥有。跨进程,速度慢。可以重入。

     当拥有Mutex的线程在未释放Mutex之前就结束时,其他线程如果调用Wait...会返回WAIT_ABANDONED_0     

     API: 
          CreateMutex  (可以指定调用线程是否获取Mutex)
          OpenMutex
          Wait...      (获取Mutex)
          ReleaseMutex
          CloseHandle
                         
Semaphore
     特点:可以同时被多个线程锁定。不可重入,同一线程多次调用wait...产生新的锁定,不能锁定就陷入阻塞。
               调用ReleaseSemaphore的线程不一定是获取了锁定的线程。任何一个线程可以在任何时间调用ReleaseSemaphore
               释放任何线程的锁定。
                   
     用途:常常用在保护固定大小的环形缓冲区。

     API:    CreateSemaphore(指定初始处于被激发状态的信号量的数目和最大数目)
               Wait...
               ReleaseSemaphore
               CloseHandle

事件
 特点:激发和未激发状态可以由程序控制,不会有wait..函数的副作用(针对手工重置)。

   不可重入。 可以由一个线程ReSetEvent, 而在另一个线程中SetEvent;


   有两种不同类型的事件对象:人工重置的事件、自动重置的事件
   当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程,要调用ResetEvent才能使事件成为未激活。
   当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程,自动调用ResetEvent

用途:通常用在overlapped I/O, 或用来设计某些自定义的同步对象。

 API:CreateEvent
         SetEvent
         ResetEvent
         PulseEvent: 对手工重置事件,设置为激发态,唤醒所有等待的线程,然后回到未激发态。人自动重置,效果与SetEvent相同
         CloseHandle 

原子操作
     InterlockedIncrement
     InterlockedDecrement
     InterLockedExchange
posted on 2011-11-04 00:46  Cabic  阅读(455)  评论(0)    收藏  举报