分享方式:


CSemaphore 類別

類別 CSemaphore 的物件代表「號誌」— 同步處理對象,允許一或多個進程中有限數目的線程存取維護目前存取指定資源的線程數目。

語法

class CSemaphore : public CSyncObject

成員

公用建構函式

名稱 描述
CSemaphore::CSemaphore 建構 CSemaphore 物件。

備註

旗號在控制共用資源的存取權方面很有用,該共用資源只能支援有限的用戶數目。 物件的目前計數 CSemaphore 是允許的其他用戶數目。 當計數達到零時,所有嘗試使用 物件所控制 CSemaphore 的資源都會插入系統佇列中,並等到逾時或計數升至 0 以上為止。 物件建構 CSemaphore 期間會指定一次可存取受控制資源的用戶數目上限。

若要使用 CSemaphore 物件,請在需要時建構 CSemaphore 物件。 指定您想要等候的號誌名稱,而且您的應用程式一開始應該擁有它。 然後,當建構函式傳回時,您可以存取旗號。 當您完成存取受控制的資源時,請呼叫 CSyncObject::Unlock

使用 CSemaphore 物件的替代方法是將 型 CSemaphore 別的變數新增為您想要控制之類別的數據成員。 在建構受控制對象期間,呼叫數據成員的 CSemaphore 建構函式,指定初始存取計數、最大存取計數、信號名稱(如果跨進程界限使用),以及所需的安全性屬性。

若要以這種方式存取物件所控制CSemaphore的資源,請先在資源的存取成員函式中建立 CSingleLock 類型或類型 CMultiLock 的變數。 然後呼叫鎖定對象的 Lock 成員函式(例如 CSingleLock::Lock)。 此時,您的線程會取得資源的存取權、等候釋放資源並取得存取權,或等候資源釋放和逾時,無法取得資源的存取權。 在任何情況下,您的資源都已以安全線程的方式存取。 若要釋放資源,請使用鎖定對象 Unlock 的成員函式(例如 CSingleLock::Unlock),或允許鎖定物件超出範圍。

或者,您可以獨立建立 CSemaphore 物件,並在嘗試存取受控制的資源之前明確存取它。 這個方法雖然對讀取原始程式碼的人員更清楚,但較容易發生錯誤。

如需如何使用CSemaphore對象的詳細資訊,請參閱多線程:如何使用同步處理類別一

繼承階層架構

CObject

CSyncObject

CSemaphore

需求

標頭: afxmt.h

CSemaphore::CSemaphore

建構具名或未命名 CSemaphore 的物件。

CSemaphore(
    LONG lInitialCount = 1,
    LONG lMaxCount = 1,
    LPCTSTR pstrName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);

參數

lInitialCount
信號的初始使用量計數。 必須大於或等於 0,且小於或等於 lMaxCount

lMaxCount
號誌的最大使用量計數。 必須大於 0。

pstrName
旗號的名稱。 如果信號會跨進程界限存取,則必須提供 。 如果 NULL為 ,則會將物件取消命名。 如果名稱符合現有的旗號,建構函式會建置新的 CSemaphore 物件,該物件會參考該名稱的旗號。 如果名稱符合不是號誌的現有同步處理物件,建構將會失敗。

lpsaAttributes
信號對象的安全性屬性。 如需此結構的完整描述,請參閱 Windows SDK 中的SECURITY_ATTRIBUTES

備註

若要存取或釋放 CSemaphore 物件,請建立 CMultiLockCSingleLock 物件,並呼叫其 LockUnlock 成員函式。

重要

建立 CSemaphore 對象之後,請使用 GetLastError 來確保 Mutex 不存在。 如果 Mutex 確實出人意料地存在,則可能表示惡意程式正在蹲下,而且可能打算惡意使用 Mutex。 在此情況下,建議的安全性意識程式是關閉句柄並繼續,就像建立物件時發生失敗一樣。

另請參閱

CSyncObject 類別
階層架構圖表