日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
談?wù)凱ulseEvent的缺陷,你明白了嗎?

但它的缺陷就在這里。

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

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

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

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

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

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

因此,PulseEvent 函數(shù)是沒有什么用的,我們應(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í),你無法預(yù)測(cè)哪個(gè)線程將被喚醒。 如果一個(gè)線程被“借用”來服務(wù)內(nèi)核 APC,那么當(dāng)它返回到等待列表時(shí),它“回到行尾”。 因此,等待內(nèi)核對(duì)象的對(duì)象的順序是不可預(yù)測(cè)的并且不能依賴。

總結(jié)

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

最后

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

本文來自:《PulseEvent is fundamentally flawed》


本文名稱:談?wù)凱ulseEvent的缺陷,你明白了嗎?
URL分享:http://www.dlmjj.cn/article/ccchcce.html