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;
};
次の表は、アプリケーションで使用される ThreadModel のテンプレート パラメーターとスレッド処理モデルと InternalAddRef と Lock のメソッドの結果を示しています:
ThreadModel = CComObjectThreadModel
メソッド |
シングル スレッド アパートメントまたはします。 |
スレッドを解放します。 |
---|---|---|
InternalAddRef |
インクリメントではスレッド セーフではありません。 |
インクリメントではスレッド セーフです。 |
Lock |
何も行われません; ロックするクリティカル セクションはありません。 |
クリティカル セクションがロックされます。 |
ThreadModel = CComObjectThreadModel::ThreadModelNoCS
メソッド |
シングル スレッド アパートメントまたはします。 |
スレッドを解放します。 |
---|---|---|
InternalAddRef |
インクリメントではスレッド セーフではありません。 |
インクリメントではスレッド セーフです。 |
Lock |
何も行われません; ロックするクリティカル セクションはありません。 |
何も行われません; ロックするクリティカル セクションはありません。 |
必要条件
ヘッダー: atlbase.h