核心物件執行緒同步 成功等待的副作用

2021-05-27 17:27:38 字數 1236 閱讀 4449

對於有些核心物件來說,成功地呼叫waitforsingleobject和waitformultipleobjects,實際上會改變物件的狀態。

成功地呼叫是指函式發現物件已經得到通知並且返回乙個相對於wait_object_0的值。如果函式返回wait_timeout或wait_failed,那麼呼叫就沒有成功。如果函式呼叫沒有成功,物件的狀態就不可能改變。

當乙個物件的狀態改變時,稱之為成功等待的***

例如,有乙個執行緒正在等待自動清除事件物件。當事件物件變為已通知狀態時,函式就會發現這個情況,並將wait_object_0返回給呼叫執行緒。但是就在函式返回之前,該事件將被置為未通知狀態,這就是成功等待的***。

物件擁有不同的***,而有些物件則根本沒有任何***。程序和執行緒核心物件就根本沒有任何***,也就是說,在這些物件之一上進行等待決不會改變物件的狀態。

究竟是什麼原因使得waitformultipleobjects函式如此有用呢,因為它能夠以原子操作方式來執行它的所有操作。當乙個執行緒呼叫waitformultipleobjects函式時,該函式能夠測試所有物件的通知狀態,並且能夠將所有必要的***作為一項操作來執行。

等待事件的例子

兩個執行緒以完全相同的方式來呼叫waitformultipleobjects:

handle h[2];

h[0] = hautoresetevent1;  // initially nonsignaled

h[1] = hautoresetevent2;  // initially nonsignaled

waitformultipleobjects(2, h, true, infinite);

當waitformultipleobjects函式被呼叫時,兩個事件都處於未通知狀態,這就迫使兩個執行緒都進入等待狀態。然後hautoresetevent1物件變為已通知狀態。兩個執行緒都發現,該事件已經變為已通知狀態,但是它們都無法被喚醒,因為hautoresetevent2仍然處於未通知狀態。由於兩個執行緒都沒有等待成功,因此沒有對hautoresetevent1物件產生任何***。

接著,hautoresetevent2變為已通知狀態。這時,兩個執行緒中的乙個發現,兩個物件都變為已通知狀態。等待取得了成功,兩個事件物件均被置為未通知狀態,該執行緒變為可排程的執行緒。但是另乙個執行緒的情況如何呢?它將繼續等待,直到它發現兩個事件物件都處於已通知狀態。儘管它原先發現hautoresetevent1處於已通知狀態,但是現在它將該物件視為未通知狀態。

執行緒同步 核心物件實現執行緒同步 事件核心物件

1 事件核心物件23 事件型別物件有兩種不同型別,手動重置和自動重置 4手動重置 當乙個手動重置物件被觸發時候,等待該物件的所有執行緒變為可排程。5自動重置 當乙個自動重置物件被觸發時,只有乙個等待該事件的執行緒會變為可排程67 下面是乙個建立事件核心物件的函式 8handle createeven...

核心物件執行緒同步 信標核心物件

信標核心物件用於對資源進行計數。乙個使用數量 乙個是最大資源數量 用於標識信標能夠控制的資源的最大數量 乙個是當前資源數量 用於標識當前可以使用的資源的數量 如果當前資源的數量大於0,則發出信標訊號。如果當前資源數量是0,則不發出信標訊號。系統決不允許當前資源的數量為負值。當前資源數量決不能大於最大...

核心物件執行緒同步 概述

使用者方式同步的優點是它的 同步速度非常快。但它也有其侷限性。例如,互鎖函式家族只能在單值上執行,根本無法使執行緒進入等待狀態。可以使用關鍵 段使執行緒進入等待狀態,但是只能用這些 段對單個程序中的執行緒實施同步。還有,使用關鍵 段時,很容易陷入死鎖狀態,因為在等待進入關鍵 段時無法設定超時值。核心...