线程的同步控制

来源:互联网 发布:西蒙弗雷泽大学 知乎 编辑:程序博客网 时间:2024/05/18 02:52

怎样去在线程间做同步控制 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

 

 

 

 

原创粉丝点击