CMutex クラス
"ミューテックス" を表します。1 つのスレッドがリソースに相互に排他的にアクセスできるようにする同期オブジェクトです。
構文
class CMutex : public CSyncObject
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CMutex::CMutex | CMutex オブジェクトを構築します。 |
解説
ミューテックスは、データまたはその他の制御されたリソースの変更を一度に 1 つのスレッドしか許可できない場合に便利です。 たとえば、リンク リストにノードを追加するプロセスは、一度に 1 つのスレッドでのみ許可する必要があります。 CMutex
オブジェクトを使用してリンク リストを制御すると、一度に 1 つのスレッドのみがリストにアクセスできます。
CMutex
オブジェクトを使用するには、必要に応じ、CMutex
オブジェクトを構築します。 待機するミューテックスの名前を指定し、アプリケーションが最初にミューテックスを所有する必要があることを指定します。 コンストラクターが戻ったときにミューテックスにアクセスできます。 制御されたリソースへのアクセスが完了したら、 CSyncObject::Unlock を呼び出します。
CMutex
オブジェクトを使用する別の方法は、CMutex
型の変数を、制御するクラスのデータ メンバーとして追加することです。 制御されたオブジェクトの構築中に、ミューテックスが最初に所有されているかどうかを指定する CMutex
データ メンバーのコンストラクター、ミューテックスの名前 (プロセス境界を越えて使用される場合)、および必要なセキュリティ属性を呼び出します。
この方法で CMutex
オブジェクトによって制御されるリソースにアクセスするには、まず、リソースのアクセス メンバー関数で、 CSingleLock または型 CMultiLock のいずれかの変数を作成します。 次に、lock オブジェクトの Lock
メンバー関数 (たとえば、 CSingleLock::Lock) を呼び出します。 この時点で、スレッドはリソースへのアクセス権を取得するか、リソースが解放されてアクセスを得るのを待つか、リソースが解放されてタイムアウトするのを待ち、リソースへのアクセスが失敗します。 いずれの場合も、リソースにはスレッド セーフな方法でアクセスされています。 リソースを解放するには、ロック オブジェクトの Unlock
メンバー関数 (たとえば、 CSingleLock::Unlock) を使用するか、ロック オブジェクトがスコープ外に落ちることを許可します。
CMutex
オブジェクトの使用方法の詳細については、「Multithreading: How to Use the Synchronization Classes」を参照してください。
継承階層
CMutex
要件
Header: afxmt.h
CMutex::CMutex
名前付きオブジェクトまたは名前のない CMutex
オブジェクトを構築します。
CMutex(
BOOL bInitiallyOwn = FALSE,
LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);
パラメーター
bInitiallyOwn
CMutex
オブジェクトを作成するスレッドが、ミューテックスによって制御されるリソースに最初にアクセスできるかどうかを指定します。
lpszName
CMutex
オブジェクトの名前。 同じ名前の別のミューテックスが存在する場合は、プロセス境界を越えてオブジェクトを使用する場合は、 lpszName を指定する必要があります。 NULLの場合、ミューテックスは名前が付けなくなります。 名前が既存のミューテックスと一致する場合、コンストラクターは、その名前のミューテックスを参照する新しい CMutex
オブジェクトを構築します。 名前がミューテックスではない既存の同期オブジェクトと一致する場合、構築は失敗します。
lpsaAttribute
ミューテックス オブジェクトのセキュリティ属性。 この構造の詳細については、Windows SDK の SECURITY_ATTRIBUTES を参照してください。
解説
CMutex
オブジェクトにアクセスまたは解放するには、CMultiLock または CSingleLock オブジェクトを作成し、その Lock および Unlock メンバー関数を呼び出します。 CMutex
オブジェクトがスタンドアロンで使用されている場合は、そのUnlock
メンバー関数を呼び出して解放します。
重要
CMutex
オブジェクトを作成した後、GetLastError を使用して、ミューテックスがまだ存在していないことを確認します。 ミューテックスが予期せず存在していた場合は、不正なプロセスがしゃがみ込み、ミューテックスを悪意を持って使用しようとしている可能性があることを示している可能性があります。 この場合、推奨されるセキュリティ意識の高い手順は、ハンドルを閉じて、オブジェクトの作成に失敗したかのように続行することです。