同步控制
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
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程,要调用ResetEvent才能使事件成为未激活。
当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程,自动调用ResetEvent
用途:通常用在overlapped I/O, 或用来设计某些自定义的同步对象。
API:CreateEvent
SetEvent
ResetEvent
PulseEvent: 对手工重置事件,设置为激发态,唤醒所有等待的线程,然后回到未激发态。人自动重置,效果与SetEvent相同
CloseHandle
原子操作
InterlockedIncrement
InterlockedDecrement
InterLockedExchange
浙公网安备 33010602011771号