我在RegisterWaitForSingleObject上读到过:http://www.albahari.com
我不明白什么时候我会更喜欢使用AutoResetEvent而不是RegisterWaitForSingleObject?
似乎我们总是可以使用RegisterWaitForSingleObject,而且它比AutoResetEvent更好,因为它没有绑定到线程。
发布于 2011-08-10 20:41:37
你正在比较一个苹果和一个桔子。RWFSO需要一个等待句柄。就像AutoResetEvent一样。RWFSO所做的是优化事件的等待。如果没有它,您将需要调用事件的WaitXxx()方法。
缩放WaitOne()会阻塞线程,直到设置了事件()。这是您希望在线程池线程中避免的情况,因为阻塞的TP线程会阻止其他调度的TP线程快速执行。线程池管理器尝试优化正在运行的TP线程数,以便执行的TP线程数不超过cpu核心数。阻塞线程搞砸了,否则管理器就不够聪明,无法知道线程阻塞的原因。只有当阻塞的TP线程在半秒内没有进展时,管理器才允许另一个等待的TP线程执行。
RWFSO非常好,但肯定不总是合适的。用它进行编程相当笨拙,特别是当你想要处理异常的时候。如果你需要取消它,这是一场令人讨厌的隐含竞争。发信号通知事件时运行的TP线程会受到相同类型的TP调度延迟的影响。而且没有RegisterWaitForMultipleObjects(),线程化通常需要使用WaitAny()。直观地:在一个事件上告诉线程一些东西已经准备好了,另一个事件告诉线程退出。
https://stackoverflow.com/questions/7009007
复制相似问题