线程的内核对象主要有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. 有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。