线程内核对象对比

线程的内核对象主要有Event,WaitableTimer, Semaphore,Mutex.
他们的共同点:
1.      有signaled和nonsignaled两程状态。
2.      有手动和自动两种模式。
这两点比较好理解,不作解释。本文主要总结其区别:
 
WaitableTimer
WaitableTimer特点比较鲜明,它到了设定的时间后,就自动切到signaled,非常好理解。
 
Event VS Semaphore
Semaphore最大的特点是,它可以同时Set signaled和Set nonsignaled多几次。这个怎么说呢。这个好比去游戏厅玩街机。
如果那台街机是Event的话,投一个币(SetEvent)就是signaled,当你挂掉(WaitForXX)后就nonsignaled,想再玩的话必须再玩必须再投个币(SetEvent)。它最大的特点是,当你没挂,你SetEvent(投币)多次是无效的。说白了Event就是个投单币系统。多投就会吞币。
如果那台街机是Semaphore的话,就跟正常的游戏机一样了,你投多次(ReleaseSemaphore),你就可以多挂(WaitForXX)几次。跟真实的游戏机一样,它是允许最大投币的限制,在Semaphore的世界中,你要是一次性投(ReleaseSemaphore)了超个机器的容量,结果会怎样呢?答案还是吞币,本次投币无效。所以Semaphore貌似是比Event强大的,要是那样,就是小看Event,Event还有大招没出!那就是自杀(ResetEvent),而Semaphore的用户想挂掉,只能等系统(WaitForXX)将你干掉。
 
Event  VS  Mutex
Mutex最大的特点是归属性。
Mutex定的规则是,谁占用谁放,其它任何人谁也甭想走后门。具体是这样:
1.      只要线程占用了Mutex,在不释放的情况下,自己可以WaitForXX无数次,自己人,Wait啥都不需要等待。其它线程WaitForXX还是需要等待的。
2.      在规则1的这种情况下,其它线程不能调用ReleaseMutex,强硬调用,此操作也会无效。
3.      直到拥有者线程ReleaseMutex后,其它线程才有机会占用。
4.      其它线程占有后,就会应用规则1
 
这里显然比Event严格,Event没有归属性,谁也无法占用它,任何线程都可以ResetEvent和SetEvent。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值