共用方式為


CComMultiThreadModel 類別

CComMultiThreadModel 提供線程安全的方法,以遞增和遞減變數的值。

語法

class CComMultiThreadModel

成員

公用 Typedefs

名稱 描述
CComMultiThreadModel::AutoCriticalSection 參考類別 CComAutoCriticalSection
CComMultiThreadModel::CriticalSection 參考類別 CComCriticalSection
CComMultiThreadModel::ThreadModelNoCS 參考類別 CComMultiThreadModelNoCS

公用方法

名稱 描述
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 個名稱。 AutoCriticalSectionCriticalSection 參考類別,這些類別提供取得和釋放重要區段擁有權的方法。 ThreadModelNoCS 參考類別 [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md)。

需求

標頭: atlbase.h

CComMultiThreadModel::AutoCriticalSection

使用 CComMultiThreadModel時,typedef名稱AutoCriticalSection會參考 CComAutoCriticalSection 類別,其提供取得和釋放重要區段對象擁有權的方法。

typedef CComAutoCriticalSection AutoCriticalSection;

備註

CComSingleThreadModelCComMultiThreadModelNoCS 也包含 的定義 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,視應用程式所使用的範本參數和線程模型而定ThreadModelLock

ThreadModel = CComObjectThreadModel

方法 單一或 Apartment 線程 免費線程處理
InternalAddRef 遞增不是安全線程。 遞增是安全線程。
Lock 不執行任何動作;沒有要鎖定的重要區段。 重要區段已鎖定。

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

方法 單一或 Apartment 線程 免費線程處理
InternalAddRef 遞增不是安全線程。 遞增是安全線程。
Lock 不執行任何動作;沒有要鎖定的重要區段。 不執行任何動作;沒有要鎖定的重要區段。

CComMultiThreadModel::CriticalSection

使用 CComMultiThreadModel時, typedef 名稱 CriticalSection 會參考類別 CComCriticalSection,其提供取得和釋放重要區段對象擁有權的方法。

typedef CComCriticalSection CriticalSection;

備註

CComSingleThreadModelCComMultiThreadModelNoCS 也包含 的定義 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 提供線程安全的方法,用於遞增和遞減變數;不過,它不提供重要區段。

CComSingleThreadModelCComMultiThreadModelNoCS 包含 的定義 ThreadModelNoCS。 下表顯示線程模型類別與 所 ThreadModelNoCS參考類別之間的關聯性:

中定義的類別 參考的類別
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

範例

請參閱 CComMultiThreadModel::AutoCriticalSection

另請參閱

CComSingleThreadModel 類別
CComAutoCriticalSection 類別
CComCriticalSection 類別
類別概觀