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
。 它也具有Lock
和Unlock
方法,但若發生例外狀況,您不需要擔心解除鎖定資源。Embedded 方法 您也可以將 -type 數據成員新增
CCriticalSection
至 類別,並視需要鎖定數據成員,來與多個線程共用類別。
如需使用CCriticalSection
對象的詳細資訊,請參閱多線程:如何使用同步處理類別一文。
繼承階層架構
CCriticalSection
需求
標頭: afxmt.h
CCriticalSection::CCriticalSection
建構 CCriticalSection
物件。
CCriticalSection();
備註
若要存取或釋放 CCriticalSection
物件,請 CSingleLock
建立 物件並呼叫其 Lock
和 Unlock
成員函式。 CCriticalSection
如果物件正在使用獨立物件,請呼叫其Unlock
成員函式來釋放它。
如果建構函式無法配置必要的系統記憶體,系統會自動擲回記憶體例外狀況(類型 CMemoryException
為 )。
範例
請參閱 CCriticalSection::Lock 的範例。
CCriticalSection::Lock
呼叫這個成員函式以取得重要區段物件的存取權。
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
參數
dwTimeout
Lock
忽略此參數值。
傳回值
如果函式成功,則為非零;否則為 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
則必須在完成由重要區段控制的資源使用之後立即呼叫 。 如果使用物件 CSingleLock
, CCriticalSection::Unlock
鎖定物件的 Unlock
成員函式將會呼叫 。
範例
請參閱 CCriticalSection::Lock
的範例。