CreateMutex(A)

ミューテックスオブジェクトを作成します。

HANDLE CreateMutexA(
    PSECURITY_ATTRIBUTES psa, // セキュリティ指定子
    BOOL    bInitialOwner,    // 所有権指定フラグ
    PCTSTR  pszMutexName      // オブジェクトの名前
);

KERNEL32.DLL

引数

psa

オブジェクトの保護属性を設定する SECURITY_ATTRIBUTES 構造体のアドレスを指定します。この構造体に、子プロセスへハンドルを継承するかどうかの情報を格納しておきます。

0 (NULL) を指定するとハンドルを継承しません。

Windows NT/2000/XP: SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバでセキュリティ記述子を設定します。 0 (NULL) を指定するとデフォルトのセキュリティ記述子が使用されます。

Windows 95/98/Me: SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバは無視されます。

bInitialOwner

初期状態のミューテックスオブジェクトの所有権を作成スレッドに与えるかどうかを指定します。 1 (TRUE) を指定するとオブジェクトの所有権は作成スレッドに渡り、オブジェクトはノンシグナル状態になります。 0 (FALSE) を指定すると、所有権を要求しません。

pszMutexName

ミューテックスオブジェクトを識別する名前の文字列へのポインタを指定します。名前にはバックスラッシュ(\)以外の任意の文字が使用できます。また、大文字・小文字は区別されます。最大文字列サイズは 260 (MAX_PATH) です。

指定した名前のミューテックスオブジェクトがすでに作成されている場合には、既存のオブジェクトに対して MUTEX_ALL_ACCESS アクセスを要求します。このとき、 bInitialOwner パラメータは無視されます。また、 psa パラメータが指す SECURITY_ATTRIBUTES 構造体のセキュリティ記述子は無視されます。

0 (NULL) を指定すると、名前なしのオブジェクトが作成されます。

指定した名前がすでに作成されているミューテックス以外の名前付きのカーネルオブジェクトの名前と一致すると、関数は失敗します。これは、カーネルオブジェクトが同じネームスペース(名前空間)を共有しているために起こります。

ターミナルサービス: ターミナルサーバでは、グローバルまたはセッションのネームスペース(名前空間)で明示的にミューテックスオブジェクトを管理させるために、 "Global\" または "Local\" のプレフィックスをつけることができます。残りの名前は、バックスラッシュ「 \ 」以外のすべての文字を使用することができます。

Windows NT/2000/XP: 高速なユーザー切り替えはターミナルサービスセッションを使用して行なわれます。最初のユーザーではセッション 0 が、次のユーザーではセッション 1 が、というように使用されます。アプリケーションが複数のユーザーをサポートできるようにするには、カーネルオブジェクトの名前は、ターミナルサービスのガイドラインに従っていなければなりません。

Windows 2000: ターミナルサービスが実行されていない場合には、 "Global\" および "Local\" のプレフィックスは無視されます。残りの名前は、バックスラッシュ「 \ 」以外のすべての文字を使用することができます。

Windows NT 4.0 以前: バックスラッシュ「 \ 」以外のすべての文字を使用することができます。

Windows 95/98/Me: バックスラッシュ「 \ 」以外のすべての文字を使用することができます。空文字列 "" も、オブジェクトの名前として有効です。

戻り値

成功すると、作成されたミューテックスオブジェクトのハンドルが返ります。すでに存在するオブジェクトのハンドルが返された場合、直後に実行した GetLastError 関数は 183 (ERROR_ALREADY_EXISTS) を返します。

失敗すると 0 (NULL) が返ります。拡張エラー情報を取得するには、 GetLastError 関数を使います。

解説

ミューテックスオブジェクトは、スレッドに所有されている場合はノンシグナル状態に、どのスレッドにも所有されていない場合はシグナル状態になります。

既存のミューテックスに対して所有権を要求するには、待機関数 ( WaitForSingleObject 関数など) を使います。このとき、ミューテックスがシグナル状態(どのスレッドにも所有されていない)ならば、直ちに所有権が与えられます。ミューテックスがノンシグナル状態(いずれかのスレッドに所有されている)ならば、その所有スレッドが所有権を解放するまで待機します。そして所有権が解放されると、待機中のスレッドのうちのひとつに所有権が与えられ、ミューテックスはノンシグナル状態となり、待機関数は制御を返します。ミューテックスを所有できるスレッドは、一度に一つだけです。所有権を解放するには、 ReleaseMutex 関数を使います。

複数のプロセスで CreateMutex 関数を使い、同じ名前のミューテックスを作成することができます。このとき、最初に関数を呼び出したプロセスでは実際にミューテックスが作成され、2 番目以降のプロセスでは既存のミューテックスのハンドルがオープンされます。この手法を使用するときは、 bInitialOwner パラメータに 0 (FALSE) を指定する必要があります。そうしないと、どのスレッドが所有権をもっているのかの判別が難しくなる恐れがあります。

ハンドルをクローズするには、 CloseHandle 関数を使います。プロセスの終了時には、システムが自動的にハンドルをクローズします。最後のハンドルがクローズされると、ミューテックスオブジェクトは破棄されます。

対応情報

Windows 95 以降 / Windows NT 3.1 以降