CMultiLock 類別
代表多執行緒程式用來控制多個資源存取的存取控制機制。
語法
class CMultiLock
成員
公用建構函式
名稱 | 描述 |
---|---|
CMultiLock::CMultiLock | 建構 CMultiLock 物件。 |
公用方法
名稱 | 描述 |
---|---|
CMultiLock::IsLocked | 判斷陣列中的特定同步處理物件是否已鎖定。 |
CMultiLock::Lock | 等候同步處理物件的陣列。 |
CMultiLock::Unlock | 釋放任何擁有的同步處理物件。 |
備註
CMultiLock
沒有基類。
若要使用 CSemaphore、CMutex 和 CEvent 同步處理類別,您可以建立 CMultiLock
或 CSingleLock 物件來等候並釋放同步處理物件。 CMultiLock
當您在特定時間可以使用多個物件時,請使用 。 當您一次只需要等候一個物件時,請使用 CSingleLock
。
若要使用 CMultiLock
物件,請先建立您想要等候的同步處理對象的陣列。 接下來,呼叫 CMultiLock
受控制資源類別中成員函式內的 物件建構函式。 然後呼叫 Lock 成員函式來判斷資源是否可用(已發出訊號)。 如果為 ,請繼續進行成員函式的其餘部分。 如果沒有可用的資源,請等候指定的時間量釋放資源,或傳回失敗。 使用資源完成之後,如果CMultiLock
物件要再次使用,或允許CMultiLock
終結物件,請呼叫 Unlock 函式。
CMultiLock
當線程有大量 CEvent
可響應的物件時,物件最有用。 建立包含所有指標的 CEvent
陣列,並呼叫 Lock
。 這會導致線程等候其中一個事件發出訊號。
如需如何使用CMultiLock
對象的詳細資訊,請參閱多線程:如何使用同步處理類別一文。
繼承階層架構
CMultiLock
需求
標頭: afxmt.h
CMultiLock::CMultiLock
建構 CMultiLock
物件。
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
參數
ppObjects
要等候之同步處理物件的指標數位。 不可以是 NULL。
dwCount
ppObjects 中的物件數目。 必須大於 0。
bInitialLock
指定是否一開始嘗試存取任何提供的物件。
備註
建立要等候的同步處理物件陣列之後,就會呼叫此函式。 它通常從線程內呼叫,該線程必須等候其中一個同步處理物件可供使用。
CMultiLock::IsLocked
判斷指定的物件是否為未對齊(無法使用)。
BOOL IsLocked(DWORD dwItem);
參數
dwItem
對象陣列中的索引,對應至正在查詢其狀態的物件。
傳回值
如果鎖定指定的物件,則為非零;否則為 0。
CMultiLock::Lock
呼叫此函式,以存取提供給建構函式之同步處理物件 CMultiLock
所控制的一或多個資源。
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
參數
dwTimeOut
指定等候同步處理物件可用的時間量(已發出訊號)。 如果為 INFINITE, Lock
則會等到對象發出訊號後再傳回。
bWaitForAll
指定傳回之前,所有等候的物件是否都必須同時發出訊號。 如果為 FALSE,當任何一個等候的物件收到訊號時, Lock
將會傳回 。
dwWakeMask
指定允許中止等候的其他條件。 如需此參數可用選項的完整清單,請參閱 Windows SDK 中的 MsgWaitForMultipleObjects 。
傳回值
如果 Lock
失敗,則會傳回 - 1。 如果成功,它會傳回下列其中一個值:
在WAIT_OBJECT_0與WAIT_OBJECT_0 + 之間 (物件數目 - 1)
如果 bWaitForAll 為 TRUE,則會發出所有對象的訊號(可用)。 如果 bWaitForAll 為 FALSE,則傳回值 - WAIT_OBJECT_0是已發出訊號的物件物件陣列中的索引(可用)。
WAIT_OBJECT_0 + (物件數目)
dwWakeMask 中指定的事件可在線程的輸入佇列中使用。
在WAIT_ABANDONED_0與WAIT_ABANDONED_0 + 之間 (物件數目 - 1)
如果 bWaitForAll 為 TRUE,則會發出所有對象的訊號,而且至少有一個物件是已放棄的 Mutex 物件。 如果 bWaitForAll 為 FALSE,則傳回值 - WAIT_ABANDONED_0是已放棄 Mutex 物件陣列中滿足等候之物件的索引。
WAIT_TIMEOUT
dwTimeOut 中指定的逾時間隔已過期,但等候成功。
備註
如果 bWaitForAll 為 TRUE,只要所有同步處理對象同時發出訊號, Lock
就會成功傳回。 如果 bWaitForAll 為 FALSE, Lock
則會在一或多個同步處理物件收到訊號後立即傳回。
如果Lock
無法立即傳回,在傳回之前,它會等待 dwTimeOut 參數中指定的毫秒數。 如果 dwTimeOut 為 INFINITE,在取得物件的存取權或符合 dwWakeMask 中指定的條件之後,Lock
才會傳回 。 否則,如果 Lock
能夠取得同步處理物件,則會成功傳回;如果沒有,則會傳回失敗。
CMultiLock::Unlock
釋放 所擁有的 CMultiLock
同步處理物件。
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
參數
lCount
要發行的參考計數數目。 必須大於 0。 如果指定的數量會導致物件的計數超過其最大值,則計數不會變更,且函式會傳回 FALSE。
lPrevCount
指向要接收同步處理物件先前計數的變數。 如果為 NULL,則不會傳回先前的計數。
傳回值
如果函式成功,則為非零;否則為 0。
備註
此函式是由 CMultiLock
的解構函式所呼叫。
第一種形式的 Unlock
嘗試解除鎖定 所 CMultiLock
管理的同步處理物件。 第二種形式的 Unlock
嘗試解除鎖定 CSemaphore
所 CMultiLock
擁有的物件。 如果 CMultiLock
沒有任何鎖定 CSemaphore
的物件,函式會傳回 FALSE,否則會傳回 TRUE。 lCount 和 lpPrevCount 與 CSingleLock::Unlock 的參數完全相同。 的第二種形式 Unlock
很少適用於多鎖定情況。