次の方法で共有


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;
};

次の表は、アプリケーションで使用される ThreadModel のテンプレート パラメーターとスレッド処理モデルと InternalAddRef と Lock のメソッドの結果を示しています:

ThreadModel = CComObjectThreadModel

メソッド

シングル スレッド アパートメントまたはします。

スレッドを解放します。

InternalAddRef

インクリメントではスレッド セーフではありません。

インクリメントではスレッド セーフです。

Lock

何も行われません; ロックするクリティカル セクションはありません。

クリティカル セクションがロックされます。

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

メソッド

シングル スレッド アパートメントまたはします。

スレッドを解放します。

InternalAddRef

インクリメントではスレッド セーフではありません。

インクリメントではスレッド セーフです。

Lock

何も行われません; ロックするクリティカル セクションはありません。

何も行われません; ロックするクリティカル セクションはありません。

必要条件

ヘッダー: atlbase.h

参照

関連項目

CComMultiThreadModel クラス

CComObjectThreadModel

CComGlobalsThreadModel

CComMultiThreadModel::ThreadModelNoCS