怎样去在线程间做同步控制 synchronization 呢? 有好几种方法,列举如此
1,Critical Section
windows 中最容易的同步机制,你需要声明一个 CRITICAL_SECTION 型别的变量,由这个变量扮演红绿灯的角色
void initializeCriticalSection(LPCRITICAL_SECTION lpCritical_Section)
void deleteCriticalSection(LPCRITICAL_SECTION lpCritical_Section)
void EnterCriticalSection(LPCRITICAL_SECTION lpCritical_Section)
void LeaveCriticalSection(LPCRITICAL_SECTION lpCritical_Section)
critical_section 的缺点很明显,无法获知其状态,因为它不是核心对象
同时可能会有死锁的情况发生
2,Mutexes 互斥锁
互斥锁 是核心对象,其操作方法与 critical section颇为类似,出了 mutex 的操作时间是 critical section 的百倍之多,只因互斥锁是核心对象
互斥锁 有激发状态和非激发状态,互斥锁为激发状态,仅仅在 没有线程也有本互斥锁,并且有waitForSingleObject()函数正在执行的短暂瞬间,而后又马上置为非激发状态。
只能够被拥有的线程释放
3,semaphore 信号量
是 互斥锁 的扩展形式,为核心对象,没有专属的拥有者
要想理解信号量,那就想想租车的场景吧(见《win32多线程程序设计》116页)
4,Event 事件
想必你已经接触过吧,没有?windows中的每次鼠标单机等操作都是事件,都会引起 event的变化
想想吧,event 有激发态和非激发态,可以指定为自动恢复或是手动恢复
正如 CreatEvent(...) 所讲。注意在自动恢复的状态下 事件 的激发态有可能遗失
5,interlock variables
允许对4字节的数值做最基本的同步操作,不需要动用 critical section 或者 mutexes