2023-08-28 10:29:38來源:今日頭條
當(dāng)我們調(diào)用 CreateEvent 函數(shù)創(chuàng)建一個事件對象的時候,我們可以通過參數(shù)來指定這個事件對象是自動重置的,還是手動重置的。
對于一個手動重置的事件對象,它很容易理解:當(dāng)事件未激發(fā)時,在此事件上的等待將一直掛起,而當(dāng)事件被激發(fā)時,在此事件對象上的等待將會立即返回。上面的工作原則和有多少個線程正在等待此對象沒有任何關(guān)系。所有線程對此對象的等待操作都是一致的,并且事件對象的狀態(tài)也不會受到等待它的線程數(shù)量影響。
對于一個自動重置的事件對象,事情開始變得復(fù)雜了。
(資料圖片僅供參考)
理解它的工作原理的最簡單方法是:將它看做是一個最大計數(shù)為 1 的信號量。
此話怎講?
當(dāng)事件未激發(fā)時,在此事件上的等待的線程將一直掛起,而當(dāng)事件被激發(fā)時,僅會只有一個等待線程結(jié)束等待,并且事件對象將會自動重置其狀態(tài)為未激發(fā)態(tài)。結(jié)果就是:剩下的其他線程將會繼續(xù)等待。從我們之前對 PulseEvent 的討論來看,你可能已經(jīng)知道了,如果有多個等待線程,則不確定將釋放哪個等待線程。
使用自動重置事件的陷阱在于:你設(shè)置了已處于激發(fā)態(tài)的事件。由于事件只有兩種狀態(tài)(設(shè)置和重置),因此設(shè)置已設(shè)置的事件不起作用。如果使用事件來控制資源生產(chǎn)者/使用者模型,則設(shè)置已處于激發(fā)態(tài)的事件將導(dǎo)致你看起來 “丟失:了令牌。
請考慮以下場景模式。
但是,如果時機沒有完全出來怎么辦?如果使用者線程完成工作有點慢(或者生產(chǎn)者線程生成它的速度有點快),該怎么辦:
請注意,生成者生成了三個工作項,但使用者只執(zhí)行了其中的兩個。第三個 SetEvent 沒有效果,因為事件已經(jīng)設(shè)置好了。(如果嘗試將信號量的令牌計數(shù)增加到超過其最大值,則會遇到相同的問題。)如果希望喚醒數(shù)與集數(shù)匹配,則需要使用最大令牌計數(shù)與將支持的最大未完成工作項數(shù)一樣高的信號量。
總結(jié)了解你手上工具的使用方法,更加需要了解其局限性。永遠在正確的場景下使用正確的工具,這確實挺難的。
關(guān)鍵詞:
當(dāng)我們調(diào)用CreateEvent函數(shù)創(chuàng)建一個事件對象的時候,我們可以通過參數(shù)
最近有人問我下面這個問題,我們依然可以使用之前我提到的“思維調(diào)試”
前言大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘
前言4G的機器上申請8G的內(nèi)存,是否可以成功?這個問題沒有辦法,是沒有
VisualStudioCode是一款功能強大、可擴展且輕量級的代碼編輯器,經(jīng)過多
數(shù)據(jù)寶統(tǒng)計,截至8月25日收盤,滬深兩市共有59只個股連續(xù)5日或5日以上
河北遵化:精心準(zhǔn)備迎開學(xué)
北京時間8月28日西甲聯(lián)賽第3輪,畢爾巴鄂競技主場對陣皇家貝蒂斯。畢爾
您好,現(xiàn)在漢格來為大家解答以上的問題。少年的繁體字圖片,少年的繁體
我是小前,我來為大家解答以上問題。diy小屋怎么自己制作房間,diy小屋
東方網(wǎng)記者包永婷8月27日報道:8月27日,上海大劇院迎來開業(yè)25周年。由
很多人對倒錯的歸結(jié)密室溺亡,倒錯的歸結(jié)不是很了解那具體是什么情況呢
C視覺攝影師周琦登臨龍泉山,猶如站在成都這座山水立體城市的觀景臺。
英國建議G7邀請中國參會,日本氣得直跳腳,六國獲中方同意入群,美國,中
大家好,今日關(guān)于【越吃越瘦的蔬菜7個讓人發(fā)胖的飲食習(xí)慣】迅速上了的