CreateMutexA 関数 (synchapi.h)
名前付きミューテックス オブジェクトまたは名前のないミューテックス オブジェクトを作成または開きます。
オブジェクトのアクセス マスクを指定するには、CreateMutexEx 関数を使用します。
構文
HANDLE CreateMutexA(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
パラメーター
[in, optional] lpMutexAttributes
SECURITY_ATTRIBUTES 構造体へのポインター。 このパラメーターが NULL
構造体の lpSecurityDescriptor メンバーは、新しいミューテックスのセキュリティ記述子を指定します。 lpMutexAttributes
[in] bInitialOwner
この値が TRUE
[in, optional] lpName
ミューテックス オブジェクトの名前。 名前は MAX_PATH 文字に制限されています。 名前の比較では大文字と小文字が区別されます。
lpName
lpName
lpName
名前には、グローバル名前空間またはセッション名前空間にオブジェクトを明示的に作成するための "Global" または "Local" プレフィックスを付けることができます。 名前の残りの部分には、円記号 (\) を除く任意の文字を含めることができます。 詳細については、「カーネル オブジェクト名前空間
オブジェクトはプライベート名前空間に作成できます。 詳細については、「オブジェクト名前空間の」を参照してください。
戻り値
関数が成功した場合、戻り値は新しく作成されたミューテックス オブジェクトへのハンドルです。
関数が失敗した場合、戻り値は NULL
ミューテックスが名前付きミューテックスで、この関数呼び出しの前にオブジェクトが存在する場合、戻り値は既存のオブジェクトへのハンドルであり、GetLastError 関数は ERROR_ALREADY_EXISTSを返します。
備考
CreateMutex によって返されるハンドルには、MUTEX_ALL_ACCESS アクセス権があります。呼び出し元にアクセス権が付与されていれば、ミューテックス オブジェクトへのハンドルを必要とする任意の関数で使用できます。 ミューテックスがサービスまたは別のユーザーを偽装しているスレッドから作成された場合は、ミューテックスを作成するときにセキュリティ記述子を適用するか、既定の DACL を変更して作成プロセスの既定のセキュリティ記述子を変更できます。 詳細については、「同期オブジェクトのセキュリティとアクセス権のを
名前付きミューテックスを使用してアプリケーションを 1 つのインスタンスに制限している場合、悪意のあるユーザーは、その前にこのミューテックスを作成し、アプリケーションの起動を防ぐことができます。 このような状況を回避するには、ランダムに名前付きミューテックスを作成し、承認されたユーザーのみが取得できるように名前を格納します。 または、この目的でファイルを使用することもできます。 アプリケーションをユーザーごとに 1 つのインスタンスに制限するには、ユーザーのプロファイル ディレクトリにロックされたファイルを作成します。
呼び出し元プロセスの任意のスレッドは、待機関数の 1への呼び出しでミューテックス オブジェクト ハンドルを指定できます。 指定したオブジェクトの状態が通知されると、単一オブジェクト待機関数が返されます。 複数オブジェクト待機関数は、いずれか 1 つ、または指定されたすべてのオブジェクトが通知されたときに返すように指示できます。 待機関数が戻ると、待機中のスレッドが解放され、実行が続行されます。
ミューテックス オブジェクトの状態は、どのスレッドも所有していない場合に通知されます。 作成スレッドは、bInitialOwner フラグを使用して、ミューテックスの即時所有権を要求できます。 それ以外の場合、スレッドは待機関数のいずれかを使用して所有権を要求する必要があります。 ミューテックスの状態が通知されると、1 つの待機スレッドに所有権が付与され、ミューテックスの状態が非署名に変わり、待機関数が返されます。 特定の時点でミューテックスを所有できるスレッドは 1 つだけです。 所有スレッドは、ReleaseMutex 関数を使用してその所有権を解放します。
ミューテックスを所有するスレッドは、実行をブロックすることなく、繰り返し待機関数呼び出しで同じミューテックスを指定できます。 通常、同じミューテックスを繰り返し待機しませんが、このメカニズムにより、既に所有しているミューテックスを待機している間にスレッド自体がデッドロックするのを防ぐことができます。 ただし、その所有権を解放するには、ミューテックスが待機を満たすたびに、スレッド ReleaseMutex を 1 回呼び出す必要があります。
2 つ以上のプロセス CreateMutex を呼び出して、同じ名前付きミューテックスを作成できます。 最初のプロセスは実際にミューテックスを作成し、十分なアクセス権を持つ後続のプロセスは既存のミューテックスへのハンドルを開くだけです。 これにより、複数のプロセスが同じミューテックスのハンドルを取得でき、作成プロセスが最初に開始されることを保証する責任をユーザーが軽減できます。 この手法を使用する場合は、
複数のプロセスが同じミューテックス オブジェクトのハンドルを持つ可能性があり、プロセス間同期にオブジェクトを使用できます。 次のオブジェクト共有メカニズムを使用できます。
CreateProcess 関数によって作成された子プロセスは、createMutex のlpMutexAttributes パラメーターで継承が有効 場合、ミューテックス オブジェクトハンドルを継承できます。 このメカニズムは、名前付きミューテックスと無名ミューテックスの両方で機能します。 - プロセスは、DuplicateHandle 関数の呼び出しでミューテックス オブジェクトへのハンドルを指定して、別のプロセスで使用できる重複するハンドルを作成できます。 このメカニズムは、名前付きミューテックスと無名ミューテックスの両方で機能します。
- プロセスは、[OpenMutex](./nf-synchapi-openmutexw.md) または CreateMutex を
してミューテックス オブジェクトへのハンドルを取得する呼び出しで名前付きミューテックスを指定できます。
例
CreateMutexの例については、ミューテックス オブジェクト の使用
手記
synchapi.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして CreateMutex を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows XP [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | synchapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む) |
ライブラリ | Kernel32.lib |
DLL | Kernel32.dll |
関連項目
CloseHandle の
CreateMutexEx の
CreateProcess の
DuplicateHandle の
ミューテックス オブジェクト の