CComMultiThreadModel 類別
CComMultiThreadModel
提供線程安全的方法,以遞增和遞減變數的值。
語法
class CComMultiThreadModel
成員
公用 Typedefs
公用方法
名稱 | 描述 |
---|---|
CComMultiThreadModel::D ecrement | (靜態)以安全線程的方式遞減指定變數的值。 |
CComMultiThreadModel::Increment | (靜態)以安全線程的方式遞增指定變數的值。 |
備註
一般而言,您可以 CComMultiThreadModel
透過兩 typedef
個名稱之一使用 [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel 或 [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel。 所 typedef
參考的類別取決於所使用的線程模型,如下表所示:
typedef | 單個線程處理 | Apartment 線程 | 免費線程處理 |
---|---|---|---|
CComObjectThreadModel |
S | S | 月 |
CComGlobalsThreadModel |
S | 月 | 月 |
S= CComSingleThreadModel
;M= CComMultiThreadModel
CComMultiThreadModel
本身會定義三 typedef
個名稱。 AutoCriticalSection
和 CriticalSection
參考類別,這些類別提供取得和釋放重要區段擁有權的方法。 ThreadModelNoCS
參考類別 [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md)。
需求
標頭: atlbase.h
CComMultiThreadModel::AutoCriticalSection
使用 CComMultiThreadModel
時,typedef
名稱AutoCriticalSection
會參考 CComAutoCriticalSection 類別,其提供取得和釋放重要區段對象擁有權的方法。
typedef CComAutoCriticalSection AutoCriticalSection;
備註
CComSingleThreadModel 和 CComMultiThreadModelNoCS 也包含 的定義 AutoCriticalSection
。 下表顯示線程模型類別與 所 AutoCriticalSection
參考的重要區段類別之間的關聯性:
中定義的類別 | 參考的類別 |
---|---|
CComMultiThreadModel |
CComCriticalSection |
CComSingleThreadModel |
CComFakeCriticalSection |
CComMultiThreadModelNoCS |
CComFakeCriticalSection |
除了 AutoCriticalSection
之外,您可以使用 typedef
CriticalSection 名稱。 如果您要排除 CRT 啟動程式代碼,就不應該在全域物件或靜態類別成員中指定 AutoCriticalSection
。
範例
下列程式代碼會在 CComObjectRootEx 之後建立模型,並示範AutoCriticalSection
如何在線程環境中使用。
template<class ThreadModel>
class CMyAutoCritClass
{
public:
typedef ThreadModel _ThreadModel;
typedef typename _ThreadModel::AutoCriticalSection _CritSec;
CMyAutoCritClass() : m_dwRef(0) {}
ULONG InternalAddRef()
{
return _ThreadModel::Increment(&m_dwRef);
}
ULONG InternalRelease()
{
return _ThreadModel::Decrement(&m_dwRef);
}
void Lock() { m_critsec.Lock( ); }
void Unlock() { m_critsec.Unlock(); }
private:
_CritSec m_critsec;
LONG m_dwRef;
下表顯示 和方法的結果InternalAddRef
,視應用程式所使用的範本參數和線程模型而定ThreadModel
:Lock
ThreadModel = CComObjectThreadModel
方法 | 單一或 Apartment 線程 | 免費線程處理 |
---|---|---|
InternalAddRef |
遞增不是安全線程。 | 遞增是安全線程。 |
Lock |
不執行任何動作;沒有要鎖定的重要區段。 | 重要區段已鎖定。 |
ThreadModel = CComObjectThreadModel::ThreadModelNoCS
方法 | 單一或 Apartment 線程 | 免費線程處理 |
---|---|---|
InternalAddRef |
遞增不是安全線程。 | 遞增是安全線程。 |
Lock |
不執行任何動作;沒有要鎖定的重要區段。 | 不執行任何動作;沒有要鎖定的重要區段。 |
CComMultiThreadModel::CriticalSection
使用 CComMultiThreadModel
時, typedef
名稱 CriticalSection
會參考類別 CComCriticalSection,其提供取得和釋放重要區段對象擁有權的方法。
typedef CComCriticalSection CriticalSection;
備註
CComSingleThreadModel 和 CComMultiThreadModelNoCS 也包含 的定義 CriticalSection
。 下表顯示線程模型類別與 所 CriticalSection
參考的重要區段類別之間的關聯性:
中定義的類別 | 參考的類別 |
---|---|
CComMultiThreadModel |
CComCriticalSection |
CComSingleThreadModel |
CComFakeCriticalSection |
CComMultiThreadModelNoCS |
CComFakeCriticalSection |
除了 CriticalSection
之外,您還可以使用 typedef
名稱 AutoCriticalSection。 如果您要排除 CRT 啟動程式代碼,就不應該在全域物件或靜態類別成員中指定 AutoCriticalSection
。
範例
請參閱 CComMultiThreadModel::AutoCriticalSection。
CComMultiThreadModel::D ecrement
此靜態函式會呼叫 Win32 函式 InterlockedDecrement,它會遞減 p 所指向的變數值。
static ULONG WINAPI Decrement(LPLONG p) throw ();
參數
p
[in]要遞減之變數的指標。
傳回值
如果遞減的結果為 0,則 Decrement
傳回 0。 如果遞減的結果為非零,則傳回值也是非零值,但可能不等於遞減的結果。
備註
InterlockedDecrement
防止多個線程同時使用這個變數。
CComMultiThreadModel::Increment
此靜態函式會呼叫 Win32 函式 InterlockedIncrement,這會遞增 p 所指向的變數值。
static ULONG WINAPI Increment(LPLONG p) throw ();
參數
p
[in]要遞增之變數的指標。
傳回值
如果增量的結果為 0,則 Increment
傳回 0。 如果增量的結果為非零,則傳回值也是非零值,但可能不等於遞增的結果。
備註
InterlockedIncrement
防止多個線程同時使用這個變數。
CComMultiThreadModel::ThreadModelNoCS
使用 CComMultiThreadModel
時,typedef
名稱ThreadModelNoCS
會參考 CComMultiThreadModelNoCS 類別。
typedef CComMultiThreadModelNoCS ThreadModelNoCS;
備註
CComMultiThreadModelNoCS
提供線程安全的方法,用於遞增和遞減變數;不過,它不提供重要區段。
CComSingleThreadModel 也 CComMultiThreadModelNoCS
包含 的定義 ThreadModelNoCS
。 下表顯示線程模型類別與 所 ThreadModelNoCS
參考類別之間的關聯性:
中定義的類別 | 參考的類別 |
---|---|
CComMultiThreadModel |
CComMultiThreadModelNoCS |
CComSingleThreadModel |
CComSingleThreadModel |
CComMultiThreadModelNoCS |
CComMultiThreadModelNoCS |
範例
請參閱 CComMultiThreadModel::AutoCriticalSection。
另請參閱
CComSingleThreadModel 類別
CComAutoCriticalSection 類別
CComCriticalSection 類別
類別概觀