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 | 月 |
CComGlobalsThreadModel |
S | 月 | 月 |
S= CComSingleThreadModel
、M= CComMultiThreadModel
CComMultiThreadModel
自体に 3 つの 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;
次の表は、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
には、変数のインクリメントとデクリメントを行うスレッドセーフ メソッドが用意されていますが、クリティカル セクションは用意されていません。
CComSingleThreadModel と CComMultiThreadModelNoCS
にも ThreadModelNoCS
の定義が含まれています。 次の表は、スレッド モデル クラスと、ThreadModelNoCS
によって参照されるクラスとのリレーションシップを示しています。
定義されるクラス | 参照されるクラス |
---|---|
CComMultiThreadModel |
CComMultiThreadModelNoCS |
CComSingleThreadModel |
CComSingleThreadModel |
CComMultiThreadModelNoCS |
CComMultiThreadModelNoCS |
例
「CComMultiThreadModel::AutoCriticalSection」を参照してください。
関連項目
CComSingleThreadModel クラス
CComAutoCriticalSection クラス
CComCriticalSection クラス
クラスの概要