分享方式:


CCriticalSection 類別

表示「重要區段」— 同步處理物件,一次允許一個線程存取程式代碼的資源或區段。

語法

class CCriticalSection : public CSyncObject

成員

公用建構函式

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

公用方法

名稱 描述
CCriticalSection::Lock 使用 取得物件的存取 CCriticalSection 權。
CCriticalSection::Unlock 釋出 CCriticalSection 物件。

公用運算子

名稱 描述
CCriticalSection::operator CRITICAL_SECTION* 擷取內部 CRITICAL_SECTION 物件的指標。

公用資料成員

名稱 描述
CCriticalSection::m_sect CRITICAL_SECTION 物件。

備註

當一次只允許一個線程修改數據或一些其他受控制的資源時,關鍵區段會很有用。 例如,將節點新增至連結清單是一個進程,一次只能由一個線程允許。 藉由使用 CCriticalSection 物件來控制連結清單,一次只能有一個線程取得清單的存取權。

注意

類別的功能 CCriticalSection 是由實際的 Win32 CRITICAL_SECTION 物件所提供。

當速度很重要,且資源不會跨進程界限使用時,會使用關鍵區段,而不是 Mutex。CMutex

使用物件的方法有兩種 CCriticalSection :獨立且內嵌在 類別中。

  • 獨立方法 若要使用獨立 CCriticalSection 物件,請在需要時建構 CCriticalSection 物件。 從建構函式成功傳回之後,使用 對 Lock的呼叫,明確鎖定 物件。 當您 Unlock 完成存取重要區段時呼叫 。 這個方法雖然對讀取原始程式碼的人員更清楚,但較容易發生錯誤,因為您必須記得在存取前後鎖定重要區段並解除鎖定。

    較好的方法是使用 類別 CSingleLock 。 它也具有 LockUnlock 方法,但若發生例外狀況,您不需要擔心解除鎖定資源。

  • Embedded 方法 您也可以將 -type 數據成員新增 CCriticalSection至 類別,並視需要鎖定數據成員,來與多個線程共用類別。

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

繼承階層架構

CObject

CSyncObject

CCriticalSection

需求

標頭: afxmt.h

CCriticalSection::CCriticalSection

建構 CCriticalSection 物件。

CCriticalSection();

備註

若要存取或釋放 CCriticalSection 物件,請 CSingleLock 建立 物件並呼叫其 LockUnlock 成員函式。 CCriticalSection如果物件正在使用獨立物件,請呼叫其Unlock成員函式來釋放它。

如果建構函式無法配置必要的系統記憶體,系統會自動擲回記憶體例外狀況(類型 CMemoryException為 )。

範例

請參閱 CCriticalSection::Lock範例。

CCriticalSection::Lock

呼叫這個成員函式以取得重要區段物件的存取權。

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

參數

dwTimeoutLock 忽略此參數值。

傳回值

如果函式成功,則為非零;否則為 0。

備註

Lock 是封鎖呼叫,在發出重要區段物件訊號後才會傳回 (變成可用)。

如果需要計時等候,您可以使用 CMutex 物件而非 CCriticalSection 物件。

如果 Lock 無法配置必要的系統記憶體,系統會自動擲回記憶體例外狀況(類型 CMemoryException為 )。

範例

此範例示範巢狀重要區段方法,方法是使用共享CCriticalSection物件控制共用資源的存取權(靜態_strShared物件)。 函 SomeMethod 式示範以安全的方式更新共享資源。

//Definition of critical section class
class CMyCritSectClass
{
   static CString _strShared; //shared resource
   static CCriticalSection _critSect;

public:
   CMyCritSectClass(void) {}
   ~CMyCritSectClass(void) {}
   void SomeMethod(void); //locks, modifies, and unlocks shared resource
};

//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()
{
   _critSect.Lock();
   if (_strShared == "")
      _strShared = "<text>";
   _critSect.Unlock();
}

CCriticalSection::m_sect

包含所有 CCriticalSection 方法所使用的重要區段物件。

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

擷取 CRITICAL_SECTION 物件。

operator CRITICAL_SECTION*();

備註

呼叫此函式以擷取內部 CRITICAL_SECTION 物件的指標。

CCriticalSection::Unlock

CCriticalSection釋放物件以供另一個線程使用。

BOOL Unlock();

傳回值

如果 CCriticalSection 物件是由線程所擁有且發行成功,則為非零,否則為0。

備註

CCriticalSection如果要獨立使用 ,Unlock則必須在完成由重要區段控制的資源使用之後立即呼叫 。 如果使用物件 CSingleLockCCriticalSection::Unlock 鎖定物件的 Unlock 成員函式將會呼叫 。

範例

請參閱 CCriticalSection::Lock 的範例。

另請參閱

CSyncObject
階層架構圖表
CMutex