CSemaphore函式原型
CSemaphore(LONGlInitialCount,
LONGlMaxCount,
LPCTSTRpstrName,
LPSECURITY_ATTRIBUTESlpsaAttributes);
參數
lInitialCount:信號量對象的初始計數值,即可訪問執行緒數目的初始值;
lMaxCount:信號量對象計數值的最大值,該參數決定了同一時刻可訪問由信號量保護的資源的執行緒最大數目;
LPCTSTRpstrName和 LPSECURITY_ATTRIBUTESlpsaAttributes兩個參數在同一進程中使用一般為NULL;
在用 CSemaphore 類的構造函式創建信號量對象時要同時指出允許的最大資源計數和當前可用資源計數。一般是將當前可用資源計數設定為最大資源計數,每增加一個執行緒對共享資源 的訪問,當前可用資源計數就會減1,只要當前可用資源計數是大於0的,就可以發出信號量信號。但是當前可用計數減小到0 時,則說明當前占用資源的執行緒數已經達到了所允許的最大數目,不能再允許其它執行緒的進入,此時的信號量信號將無法發出。執行緒在處理完共享資源後,應在離開 的同時通過 ReleaseSemaphore() 函式將當前可用資源數加1。
CSemaphore
CObject | └CSyncObject | └CSemaphore |
CSemaphore對象的當前計數是還可以允許的其它用戶的數目。當這個計數達到零的時候,所有對這個由CSemaphore對象控制的資源的訪問嘗試都將被插入到一個系統佇列中等待,直到它們的時間用完或計數值不再為零。這個被控制的資源可以同時接受訪問的最大用戶數目是在CSemaphore對象的構造期間被指定的。
要使用一個CSemaphore對象,則在需要的時候構造這個對象。指定你想要等待的信號的名字,應用程式應該在最初就擁有它。然後你就可以在構造函式返回時訪問這個信號。當你要訪問這個被控制的資源時,調用CSyncObject::Unlock。
使用CSemaphore對象的另一種方法是,將一個CSemaphore類型的變數添加到你想要控制的類中作為一個數據成員。在被控制對象的構造期間,調用CSemaphore數據成員的構造函式來指定訪問計數的初始值,訪問計數的最大值,信號的名字(如果它要在整個進程中使用),以及需要的安全標誌。
要訪問由CSemaphore對象用這種方式控制的資源,首先要在你的資源的訪問成員函式中創建一個CSingleLock類型或CMultiLock類型的變數。然後調用加鎖對象的Lock成員函式(例如,CSingleLock::Lock)。這時,你的執行緒將達到對資源的訪問,等待資源被釋放並訪問它,或者是在等待資源被釋放的過程中超過了時間,對資源的訪問失敗。不管是哪一種情況,你的資源都是以一種執行緒安全(thread-safe)方式被訪問的。要釋放資源,可以使用加鎖對象的Unlock成員函式(例如,CSingleLock::Unlock),或者是讓加鎖對象超越範圍。
另外,你可以單獨創建一個CSemaphore對象,並且在嘗試訪問被控制的資源之前顯式地訪問CSemaphore對象。這種方法雖然對閱讀你的原始碼的人來說更加清楚,但是卻更易於出錯。
說明
此成員函式用來構造一個有名字或沒有名字的CSemaphore對象。要訪問或釋放一個CSemaphore對象,可以創建一個CMultiLock或CSingleLock對象,並調用它們的Lock和Unlock函式。
請參閱:CMutex, CEvent, CMultiLock, CSingleLock