分享方式:


CMultiLock 類別

代表多執行緒程式用來控制多個資源存取的存取控制機制。

語法

class CMultiLock

成員

公用建構函式

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

公用方法

名稱 描述
CMultiLock::IsLocked 判斷陣列中的特定同步處理物件是否已鎖定。
CMultiLock::Lock 等候同步處理物件的陣列。
CMultiLock::Unlock 釋放任何擁有的同步處理物件。

備註

CMultiLock 沒有基類。

若要使用 CSemaphoreCMutexCEvent 同步處理類別,您可以建立 CMultiLockCSingleLock 物件來等候並釋放同步處理物件。 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 嘗試解除鎖定 CSemaphoreCMultiLock擁有的物件。 如果 CMultiLock 沒有任何鎖定 CSemaphore 的物件,函式會傳回 FALSE,否則會傳回 TRUE。 lCountlpPrevCount 與 CSingleLock::Unlock 的參數完全相同。 的第二種形式 Unlock 很少適用於多鎖定情況。

另請參閱

階層架構圖表