自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談?wù)凱ulseEvent的缺陷,你明白了嗎?

開(kāi)發(fā) 架構(gòu)
你可以嘗試使用SignalObjectAndWait這個(gè)函數(shù),它會(huì)將信號(hào)激發(fā)和等待合并到一個(gè)單獨(dú)的操作中。但是即使是這樣,你還是無(wú)法確定線程在脈沖發(fā)生時(shí)是否正在等待事件。

PulseEvent這個(gè)是API會(huì)釋放一個(gè)(如果手動(dòng)重置開(kāi)啟的話,則是多個(gè))正在等待事件對(duì)象的線程,并將事件對(duì)象設(shè)置一個(gè)”未設(shè)置”的狀態(tài)。如果這個(gè)時(shí)候碰巧沒(méi)有任何線程在等待這個(gè)事件,則事件除了被設(shè)置為”未設(shè)置”狀態(tài)以外,不會(huì)發(fā)生任何其他事情。

但它的缺陷就在這里。

你怎么知道,你所認(rèn)為的正在等待事件的線程就一定是”真的(正在等待)”?顯然我們不能使用如下的方法:

因?yàn)樵谏厦娴拇a中,激發(fā)信號(hào)和等待事件這兩個(gè)操作存在一個(gè)競(jìng)爭(zhēng)條件。信號(hào)對(duì)象所激發(fā)的線程可能在你等待事件對(duì)象之前,就已經(jīng)完成了所有工作并將激發(fā)出一個(gè)事件脈沖(PulseEvent)了。

你可以嘗試使用SignalObjectAndWait這個(gè)函數(shù),它會(huì)將信號(hào)激發(fā)和等待合并到一個(gè)單獨(dú)的操作中。但是即使是這樣,你還是無(wú)法確定線程在脈沖發(fā)生時(shí)是否正在等待事件。

當(dāng)一個(gè)線程等待事件時(shí),設(shè)備驅(qū)動(dòng)或者內(nèi)核本身的一部分可能會(huì)借用線程來(lái)進(jìn)行一些任務(wù)處理(通過(guò)內(nèi)核模式APC)。在此期間,線程不處于等待狀態(tài),因?yàn)樵O(shè)備驅(qū)動(dòng)正在使用它。如果PulseEvent在線程借用時(shí)發(fā)生,則它不會(huì)從等待中喚醒,因?yàn)镻ulseEvent函數(shù)只會(huì)喚醒在PulseEvent發(fā)生時(shí)正在等待的線程。

用戶(hù)模式程序不僅無(wú)法阻止內(nèi)核模式代碼對(duì)用戶(hù)模式程序線程執(zhí)行此操作,甚至也沒(méi)辦法檢測(cè)它是否已經(jīng)發(fā)生。

(你可能會(huì)看到這種事情發(fā)生的一個(gè)地方是,如果你將調(diào)試器附加到進(jìn)程,因?yàn)檎{(diào)試器會(huì)執(zhí)行諸如掛起和恢復(fù)線程之類(lèi)的事情,這會(huì)導(dǎo)致內(nèi)核 APC。)

因此,PulseEvent 函數(shù)是沒(méi)有什么用的,我們應(yīng)該避免使用它。

它繼續(xù)存在只是為了向后兼容。

附加信息:與內(nèi)核 APC 相關(guān)的整個(gè)業(yè)務(wù)還意味著,當(dāng)你激發(fā)一個(gè)信號(hào)量、自動(dòng)重置事件或其他在發(fā)出信號(hào)時(shí)釋放單個(gè)線程的同步對(duì)象時(shí),你無(wú)法預(yù)測(cè)哪個(gè)線程將被喚醒。 如果一個(gè)線程被“借用”來(lái)服務(wù)內(nèi)核 APC,那么當(dāng)它返回到等待列表時(shí),它“回到行尾”。 因此,等待內(nèi)核對(duì)象的對(duì)象的順序是不可預(yù)測(cè)的并且不能依賴(lài)。

總結(jié)

請(qǐng)老老實(shí)實(shí)使用SetEvent/ResetEvent,簡(jiǎn)單,實(shí)在!

最后

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識(shí),對(duì)于廣大Windows平臺(tái)開(kāi)發(fā)者來(lái)說(shuō),確實(shí)十分有幫助。

本文來(lái)自:《PulseEvent is fundamentally flawed》

責(zé)任編輯:武曉燕 來(lái)源: 拓?fù)涿窢?/a>
相關(guān)推薦

2022-12-30 08:35:00

2022-10-10 18:38:56

inert屬性鍵盤(pán)

2023-12-08 08:38:15

EventLoopAPI瀏覽器

2023-12-28 08:43:28

前端算法搜索

2024-01-08 20:05:32

2022-10-19 08:19:32

動(dòng)態(tài)基線預(yù)警

2023-11-06 07:37:01

函數(shù)式插槽React

2023-06-09 07:18:03

開(kāi)源數(shù)據(jù)庫(kù)

2024-08-28 13:09:50

2022-05-31 07:32:19

JDK8API工具

2022-09-09 10:15:06

OAuthJava

2023-06-14 08:15:34

算法合并操作Winner

2023-12-06 08:01:03

CSSPostCSS

2024-03-27 13:33:00

MySQLInnoDB事務(wù)

2022-10-24 20:25:40

云原生SpringJava

2015-09-18 09:17:06

數(shù)據(jù)分析

2022-03-05 17:56:29

桌面應(yīng)用開(kāi)發(fā)

2022-10-08 08:09:13

MGRGreatSQL事務(wù)

2023-01-02 23:58:03

2022-07-27 08:31:28

SQL開(kāi)發(fā)控制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)