CComMultiThreadModel クラス

CComMultiThreadModel には、変数の値をインクリメントおよびデクリメントするためのスレッドセーフ メソッドが用意されています。

構文

class CComMultiThreadModel

メンバー

パブリック typedef

名前 説明
CComMultiThreadModel::AutoCriticalSection クラス CComAutoCriticalSection を参照します。
CComMultiThreadModel::CriticalSection クラス CComCriticalSection を参照します。
CComMultiThreadModel::ThreadModelNoCS クラス CComMultiThreadModelNoCS を参照します。

パブリック メソッド

名前 説明
CComMultiThreadModel::Decrement (静的) スレッドセーフな方法で指定された変数の値をデクリメントします。
CComMultiThreadModel::Increment (静的) スレッドセーフな方法で指定された変数の値をインクリメントします。

解説

通常、2 つある typedef 名のいずれか [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel または [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel を介して CComMultiThreadModel を使います。 各 typedef で参照されるクラスは、次の表に示すように、使うスレッド モデルに依存します。

typedef 単一スレッド アパートメント スレッド フリー スレッド
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel、M= CComMultiThreadModel

CComMultiThreadModel 自体に 3 つの typedef 名が定義されています。 AutoCriticalSectionCriticalSection は、クリティカル セクションの所有権を取得および解放するためのメソッドが用意されているクラスを参照します。 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;

次の表は、ThreadModel テンプレート パラメーターとアプリケーションで使われるスレッド モデルに応じた InternalAddRef および Lock メソッドの結果を示しています。

ThreadModel = CComObjectThreadModel

方法 シングル スレッドまたはアパートメント スレッド フリー スレッド
InternalAddRef インクリメントはスレッドセーフではありません。 インクリメントはスレッドセーフです。
Lock 何も行われません。ロックするクリティカル セクションがありません。 クリティカル セクションがロックされています。

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

方法 シングル スレッドまたはアパートメント スレッド フリー スレッド
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::Decrement

この静的関数によって Win32 関数 InterlockedDecrement が呼び出され、それにより、p によって指し示される変数の値がディクリメントされます。

static ULONG WINAPI Decrement(LPLONG p) throw ();

パラメーター

P
[入力] デクリメントする変数を指すポインター。

戻り値

デクリメントの結果が 0 である場合、Decrement からは 0 が返されます。 デクリメントの結果が 0 以外の場合、戻り値も 0 以外になりますが、デクリメントの結果とは一致しない可能性があります。

解説

InterlockedDecrement により、複数のスレッドでこの変数が同時に使用されるのを防ぐことができます。

CComMultiThreadModel::Increment

この静的関数によって Win32 関数 InterlockedIncrement が呼び出され、それにより、p によって指し示される変数の値がディクリメントされます。

static ULONG WINAPI Increment(LPLONG p) throw ();

パラメーター

P
[入力] インクリメントする変数を指すポインター。

戻り値

インクリメントの結果が 0 である場合、Increment からは 0 が返されます。 インクリメントの結果が 0 以外の場合、戻り値も 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 クラス
クラスの概要