共用方式為


旗號物件

號志物件是同步處理物件,可維護介於零與指定最大值之間的計數。 每次執行緒完成等候號志物件時,都會遞減計數,並線上程釋放號志時遞增。 當計數達到零時,不會再成功等候號志物件狀態收到訊號。 旗號的狀態會在其計數大於零時設定為已收到訊號,並在計數為零時設定為未收到訊號。

旗號物件在控制可支援有限使用者數量的共用資源時很有用。 其可作為閘道,將共用資源的執行緒數目限制為指定的最大數目。 例如,應用程式可能會限制它所建立的視窗數目。 它會使用與視窗限制相等最大計數的號志,在建立視窗時遞減計數,並在每次關閉視窗時遞增計數。 應用程式會在建立每個視窗之前,指定呼叫其中一個 等候函 式的號志物件。 當計數為零時,表示已達到視窗限制—等候函式會封鎖視窗建立程式碼的執行。

執行緒會使用 CreateSemaphoreCreateSemaphoreEx 函式來建立號志物件。 建立執行緒會指定物件的初始計數和最大值。 初始計數不得小於零或大於最大值。 建立執行緒也可以指定號志物件的名稱。 其他進程中的執行緒可以在 呼叫 OpenSemaphore 函式時指定其名稱,以開啟現有號志物件的控制碼。 如需 mutex、事件、號志和計時器物件名稱的其他資訊,請參閱 進程間同步處理

如果多個執行緒正在等候號志,則會選取等候的執行緒。 請勿假設先入先出 (FIFO) 順序。 核心模式 APC 之類的外來事件可以變更等候順序。

每次其中一個 等候函 式傳回時,因為號志的狀態設定為訊號,號志的計數會減少一個。 ReleaseSemaphore函式會以指定的數量增加號志的計數。 計數永遠不能小於零或大於最大值。

號志的初始計數通常會設定為最大值。 然後,計數會從該層級遞減,因為已取用受保護的資源。 或者,您可以在初始化應用程式時,建立具有初始計數為零的號志,以封鎖對受保護資源的存取。 初始化之後,您可以使用 ReleaseSemaphore 將計數遞增為最大值。

擁有 Mutex 物件的執行緒可以重複等候相同的 Mutex 物件收到訊號,而不會遭到封鎖執行。 重複等候相同號志物件的執行緒,不過,每次等候作業完成時,都會遞減號號的計數;當計數到達零時,就會封鎖執行緒。 同樣地,只有擁有 Mutex 的執行緒可以成功呼叫 ReleaseMutex 函式,不過任何執行緒都可以使用 ReleaseSemaphore 來增加號志物件的計數。

執行緒可以在呼叫任何 等候函式時重複指定相同的號志物件,以遞減號號的計數一次以上。 不過,使用包含相同號志之多個控制碼的陣列呼叫其中一個多重物件等候函式,並不會產生多個遞減。

當您完成使用號志物件時,請呼叫 CloseHandle 函式以關閉控制碼。 當最後一個控制碼關閉時,旗號物件就會終結。 關閉控制碼不會影響號號號計數;因此,請務必先呼叫 ReleaseSemaphore ,再關閉控制碼或進程終止之前。 否則,視是否已指定逾時值而定,擱置等候作業將會逾時或無限期地繼續。

使用旗號物件