次の方法で共有


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」を参照してください。

継承階層

CObject

CSyncObject

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 を使用して、ミューテックスがまだ存在していないことを確認します。 ミューテックスが予期せず存在していた場合は、不正なプロセスがしゃがみ込み、ミューテックスを悪意を持って使用しようとしている可能性があることを示している可能性があります。 この場合、推奨されるセキュリティ意識の高い手順は、ハンドルを閉じて、オブジェクトの作成に失敗したかのように続行することです。

関連項目

CSyncObject クラス
階層図