线程的同步控制

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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值