谈谈PulseEvent的缺陷

PulseEvent这个是API会释放一个(如果手动重置开启的话,则是多个)正在等待事件对象的线程,并将事件对象设置一个”未设置”的状态。如果这个时候碰巧没有任何线程在等待这个事件,则事件除了被设置为”未设置”状态以外,不会发生任何其他事情。xJL每天发布大量与生活相关的资讯平台

但它的缺陷就在这里。xJL每天发布大量与生活相关的资讯平台

你怎么知道,你所认为的正在等待事件的线程就一定是”真的(正在等待)”?显然我们不能使用如下的方法:xJL每天发布大量与生活相关的资讯平台

xJL每天发布大量与生活相关的资讯平台

因为在上面的代码中,激发信号和等待事件这两个操作存在一个竞争条件。信号对象所激发的线程可能在你等待事件对象之前,就已经完成了所有工作并将激发出一个事件脉冲(PulseEvent)了。xJL每天发布大量与生活相关的资讯平台

你可以尝试使用SignalObjectAndWait这个函数,它会将信号激发和等待合并到一个单独的操作中。但是即使是这样,你还是无法确定线程在脉冲发生时是否正在等待事件。xJL每天发布大量与生活相关的资讯平台

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

用户模式程序不仅无法阻止内核模式代码对用户模式程序线程执行此操作,甚至也没办法检测它是否已经发生。xJL每天发布大量与生活相关的资讯平台

(你可能会看到这种事情发生的一个地方是,如果你将调试器附加到进程,因为调试器会执行诸如挂起和恢复线程之类的事情,这会导致内核 APC。)xJL每天发布大量与生活相关的资讯平台

因此,PulseEvent 函数是没有什么用的,我们应该避免使用它。xJL每天发布大量与生活相关的资讯平台

它继续存在只是为了向后兼容。xJL每天发布大量与生活相关的资讯平台

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

xJL每天发布大量与生活相关的资讯平台

展开全文
xJL每天发布大量与生活相关的资讯平台

总结

请老老实实使用SetEvent/ResetEvent,简单,实在!xJL每天发布大量与生活相关的资讯平台

最后

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

本文来自:《PulseEvent is fundamentally flawed》xJL每天发布大量与生活相关的资讯平台

xJL每天发布大量与生活相关的资讯平台

xJL每天发布大量与生活相关的资讯平台

也许你还喜欢

ups不间断电源原理分析

当前在电源市场上,所销售的电源类型较多,不同类型的电源,相应的功能与作用有所不同。在超

空间背景音乐怎么添加图文教程分享

怎样免费添加QQ空间背景音乐其实步骤也不多,很简单,主要有以下几个步骤,详情如下

万能转换器破解版怎么用?具体操作方

万能格式转换器是一款功能强大的格式转换软件,音频、视频、图片、光驱设备都可以通过万

rmvb转mp4格式转换器图文教程

在我们日常娱乐和日常工作中,现在网络上一些高清的视频一般都是rmvb格式的,而一些播放设

支付宝网络系统异常怎么解决

支付宝支付出现网络系统异常是因为IE浏览器设置Internet选项不恰当而导致的,去重新设置

win10蓝牙驱动破解版安装图文教程

win10蓝牙驱动怎么安装?请看下面具体操作方法。

微孔抛光镜面加工计数详解

一般来说,对于小孔微孔进行抛光,传统的加工方法可能会导致孔洞磨损,或者加工效果不理想。

短视频内容管理助手有哪些?怎么好用

随着短视频的普及,越来越多的人开始将大量的时间和精力投入到短视频的制作和分享中。因

模具设计学习知识分享

今天,我想谈谈我在模具设计CAD方面的一些心得体会。作为一个从事这个行业多年的工程师,

seo优化排名软件详细介绍

1. SEMrush SEMrush,一款广受好评的SEO神器,被誉为业内最佳的SEO分析工具。功能包括全