自动重置事件只是一个愚蠢的信号量
创始人
2025-06-29 22:31:47
0

当我们调用 CreateEvent 函数创建一个事件对象的时候,我们可以通过参数来指定这个事件对象是自动重置的,还是手动重置的。

对于一个手动重置的事件对象,它很容易理解:当事件未激发时,在此事件上的等待将一直挂起,而当事件被激发时,在此事件对象上的等待将会立即返回。上面的工作原则和有多少个线程正在等待此对象没有任何关系。所有线程对此对象的等待操作都是一致的,并且事件对象的状态也不会受到等待它的线程数量影响。

对于一个自动重置的事件对象,事情开始变得复杂了。

理解它的工作原理的最简单方法是:将它看做是一个最大计数为 1 的信号量。

此话怎讲?

当事件未激发时,在此事件上的等待的线程将一直挂起,而当事件被激发时,仅会只有一个等待线程结束等待,并且事件对象将会自动重置其状态为未激发态。结果就是:剩下的其他线程将会继续等待。从我们之前对 PulseEvent 的讨论来看,你可能已经知道了,如果有多个等待线程,则不确定将释放哪个等待线程。

使用自动重置事件的陷阱在于:你设置了已处于激发态的事件。由于事件只有两种状态(设置和重置),因此设置已设置的事件不起作用。如果使用事件来控制资源生产者/使用者模型,则设置已处于激发态的事件将导致你看起来 “丢失:了令牌。

请考虑以下场景模式。

但是,如果时机没有完全出来怎么办?如果使用者线程完成工作有点慢(或者生产者线程生成它的速度有点快),该怎么办:

请注意,生成者生成了三个工作项,但使用者只执行了其中的两个。第三个 SetEvent 没有效果,因为事件已经设置好了。(如果尝试将信号量的令牌计数增加到超过其最大值,则会遇到相同的问题。)如果希望唤醒数与集数匹配,则需要使用最大令牌计数与将支持的最大未完成工作项数一样高的信号量。

总结

了解你手上工具的使用方法,更加需要了解其局限性。永远在正确的场景下使用正确的工具,这确实挺难的。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...