文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

谈谈PulseEvent的缺陷,你明白了吗?

2024-12-02 04:22

关注

但它的缺陷就在这里。

你怎么知道,你所认为的正在等待事件的线程就一定是”真的(正在等待)”?显然我们不能使用如下的方法:

因为在上面的代码中,激发信号和等待事件这两个操作存在一个竞争条件。信号对象所激发的线程可能在你等待事件对象之前,就已经完成了所有工作并将激发出一个事件脉冲(PulseEvent)了。

你可以尝试使用SignalObjectAndWait这个函数,它会将信号激发和等待合并到一个单独的操作中。但是即使是这样,你还是无法确定线程在脉冲发生时是否正在等待事件。

当一个线程等待事件时,设备驱动或者内核本身的一部分可能会借用线程来进行一些任务处理(通过内核模式APC)。在此期间,线程不处于等待状态,因为设备驱动正在使用它。如果PulseEvent在线程借用时发生,则它不会从等待中唤醒,因为PulseEvent函数只会唤醒在PulseEvent发生时正在等待的线程。

用户模式程序不仅无法阻止内核模式代码对用户模式程序线程执行此操作,甚至也没办法检测它是否已经发生。

(你可能会看到这种事情发生的一个地方是,如果你将调试器附加到进程,因为调试器会执行诸如挂起和恢复线程之类的事情,这会导致内核 APC。)

因此,PulseEvent 函数是没有什么用的,我们应该避免使用它。

它继续存在只是为了向后兼容。

附加信息:与内核 APC 相关的整个业务还意味着,当你激发一个信号量、自动重置事件或其他在发出信号时释放单个线程的同步对象时,你无法预测哪个线程将被唤醒。 如果一个线程被“借用”来服务内核 APC,那么当它返回到等待列表时,它“回到行尾”。 因此,等待内核对象的对象的顺序是不可预测的并且不能依赖。

总结

请老老实实使用SetEvent/ResetEvent,简单,实在!

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《PulseEvent is fundamentally flawed》

来源:拓扑梅尔内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯