この記事の英語版を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語
このドキュメントはアーカイブされており、メンテナンスされていません。

Mutex クラス

同期プリミティブは、プロセス間の同期にも使用できます。

名前空間:  System.Threading
アセンブリ:  mscorlib (mscorlib.dll 内)

[ComVisibleAttribute(true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public sealed class Mutex : WaitHandle

Mutex 型で公開されるメンバーは以下のとおりです。

  名前説明
パブリック メソッドXNA Framework によるサポートMutex() Mutex クラスの新しいインスタンスを既定のプロパティを使用して初期化します。
パブリック メソッドXNA Framework によるサポートMutex(Boolean)呼び出し元のスレッドにミューテックスの初期所有権があるかどうかを示す Boolean 型の値を使用して、Mutex クラスの新しいインスタンスを初期化します。
パブリック メソッドMutex(Boolean, String)呼び出し元のスレッドにミューテックスの初期所有権があるかどうかを示す Boolean 型の値と、ミューテックスの名前を表す文字列を使用して、Mutex クラスの新しいインスタンスを初期化します。
パブリック メソッドMutex(Boolean, String, Boolean)Boolean 型の値を使用して、Mutex クラスの新しいインスタンスを初期化します。この Boolean 型の値は、呼び出し元のスレッドにミューテックスの初期所有権があるかどうか、ミューテックスの名前を表す文字列、およびメソッドが返されるときにミューテックスの初期所有権が呼び出し元のスレッドに付与されたかどうかを示す Boolean 値を示します。
パブリック メソッドMutex(Boolean, String, Boolean, MutexSecurity)Boolean 型の値を使用して、Mutex クラスの新しいインスタンスを初期化します。この Boolean 型の値は、呼び出し元のスレッドにミューテックスの初期所有権があるかどうか、ミューテックスの名前を表す文字列、メソッドが返されるときにミューテックスの初期所有権が呼び出し元のスレッドに付与されたかどうかを示す Boolean 変数、および名前付きミューテックスに適用するアクセス制御セキュリティを示します。
このページのトップへ

  名前説明
パブリック プロパティXNA Framework によるサポートHandle 互換性のために残されています。 ネイティブ オペレーティング システム ハンドルを取得または設定します。 (WaitHandle から継承されます。)
パブリック プロパティSafeWaitHandleネイティブ オペレーティング システム ハンドルを取得または設定します。 (WaitHandle から継承されます。)
このページのトップへ

  名前説明
パブリック メソッドXNA Framework によるサポートClose派生クラスでオーバーライドされると、現在の WaitHandle で保持されているすべてのリソースを解放します。 (WaitHandle から継承されます。)

XNA Frameworkでは、このメンバーは Close() でオーバーライドされています。
パブリック メソッドCreateObjRefリモート オブジェクトとの通信に使用するプロキシの生成に必要な情報をすべて格納しているオブジェクトを作成します。 (MarshalByRefObject から継承されます。)
パブリック メソッドDispose() WaitHandle クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。 (WaitHandle から継承されます。)
プロテクト メソッドXNA Framework によるサポートDispose(Boolean)派生クラスでオーバーライドされると、WaitHandle によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。 (WaitHandle から継承されます。)
パブリック メソッドXNA Framework によるサポートEquals(Object)指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)
プロテクト メソッドXNA Framework によるサポートFinalizeオブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)
パブリック メソッドGetAccessControl名前付きミューテックスのアクセス制御セキュリティを表す MutexSecurity オブジェクトを取得します。
パブリック メソッドXNA Framework によるサポートGetHashCode特定の型のハッシュ関数として機能します。 (Object から継承されます。)
パブリック メソッドGetLifetimeService対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。 (MarshalByRefObject から継承されます。)
パブリック メソッドXNA Framework によるサポートGetType現在のインスタンスの Type を取得します。 (Object から継承されます。)
パブリック メソッドInitializeLifetimeService対象のインスタンスの有効期間ポリシーを制御する、有効期間サービス オブジェクトを取得します。 (MarshalByRefObject から継承されます。)
プロテクト メソッドXNA Framework によるサポートMemberwiseClone()現在の Object の簡易コピーを作成します。 (Object から継承されます。)
プロテクト メソッドMemberwiseClone(Boolean)現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。 (MarshalByRefObject から継承されます。)
パブリック メソッド静的メンバーOpenExisting(String)既存の名前付きミューテックスを開きます。
パブリック メソッド静的メンバーOpenExisting(String, MutexRights)必要なセキュリティ アクセスを指定して、既存の名前付きミューテックスを開きます。
パブリック メソッドXNA Framework によるサポートReleaseMutex Mutex をいったん解放します。
パブリック メソッドSetAccessControl名前付きシステム ミューテックスのアクセス制御セキュリティを設定します。
パブリック メソッドXNA Framework によるサポートToString現在のオブジェクトを表す文字列を返します。 (Object から継承されます。)
パブリック メソッドXNA Framework によるサポートWaitOne()現在の WaitHandle が信号を受信するまで、現在のスレッドをブロックします。 (WaitHandle から継承されます。)

XNA Frameworkでは、このメンバーは WaitOne() でオーバーライドされています。
パブリック メソッドWaitOne(Int32)32 ビット符号付き整数を使用して時間間隔を指定し、現在の WaitHandle が信号を受信するまで、現在のスレッドをブロックします。 (WaitHandle から継承されます。)
パブリック メソッドWaitOne(TimeSpan) TimeSpan を使用して時間間隔を指定し、現在のインスタンスが信号を受信するまで、現在のスレッドをブロックします。 (WaitHandle から継承されます。)
パブリック メソッドXNA Framework によるサポートWaitOne(Int32, Boolean)現在の WaitHandle がシグナルを受信するまで現在のスレッドをブロックします。このとき、時間間隔を指定するために 32 ビット符号付き整数を使用し、待機する前に同期ドメインを終了するかどうかを指定します。 (WaitHandle から継承されます。)

XNA Frameworkでは、このメンバーは WaitOne(Int32, Boolean) でオーバーライドされています。
パブリック メソッドWaitOne(TimeSpan, Boolean)現在のインスタンスがシグナルを受信するまで現在のスレッドをブロックします。このとき TimeSpan を使用して時間間隔を指定し、待機の前に同期ドメインを終了するかどうかを指定します。 (WaitHandle から継承されます。)
このページのトップへ

  名前説明
明示的なインターフェイス実装プライベート メソッドXNA Framework によるサポートIDisposable.Disposeインフラストラクチャ。 WaitHandle によって使用されているすべてのリソースを解放します。 (WaitHandle から継承されます。)
このページのトップへ

2 つ以上のスレッドが同時に共有リソースにアクセスする必要がある場合は、システムには同期機構を使用して、一度に 1 つのスレッドがリソースを使用することを保証する必要があります。 Mutex は、共有リソースへの排他アクセス権を 1 つのスレッドにだけ付与する同期プリミティブです。 あるスレッドがミューテックスを取得すると、ミューテックスを取得しようとしている 2 つ目のスレッドは最初のスレッドがミューテックスを解放するまで中断されます。

ミューテックスの所有権を要求するには、WaitHandle.WaitOne メソッドを使用します。 スレッドがミューテックスを所有していると、WaitOne の呼び出しを繰り返すときに、スレッドの実行をブロックせずに同じミューテックスを要求できます。 ただし、ミューテックスの所有権を解放する場合、このスレッドは ReleaseMutex メソッドを同じ回数呼び出す必要があります。 Mutex クラスはスレッド ID を適用するため、ミューテックスを解放できるのはそのミューテックスを取得したスレッドだけです。 これに対して、Semaphore クラスはスレッド ID を適用しません。

ミューテックスを所有しているスレッドが終了した場合は、ミューテックスが放棄されたと言います。 ミューテックスはシグナル状態になり、待機していた次のスレッドが所有権を取得します。 .NET Framework Version 2.0 以降では、放棄されたミューテックスを取得する次のスレッドで AbandonedMutexException 例外がスローされるようになりました。 .NET Framework Version 2.0 より前のバージョンでは、例外はスローされませんでした。

Caution メモ注意

放棄されたミューテックスは、多くの場合、コードに深刻なエラーが存在することを意味します。 スレッドがミューテックスを解放せずに終了すると、ミューテックスによって保護されるデータ構造の状態に不整合が生じることがあります。 ミューテックスの所有権を要求する次のスレッドが、データ構造の整合性を検証できる場合、この例外を処理して続行できます。

システム全体で有効なミューテックスの場合、放棄されたミューテックスは、アプリケーションが (たとえば Windows タスク マネージャーを使用して) 強制終了されたことを示す場合があります。

ミューテックスには、名前のないローカル ミューテックスと、名前付きシステム ミューテックスの 2 種類があります。 ローカル ミューテックスは、現在のプロセス内部でのみ存在します。 これは、ミューテックスを表す Mutex オブジェクトへの参照を持つプロセス内のすべてのスレッドで使用できます。 名前のない各 Mutex オブジェクトは個別のローカル ミューテックスを表します。

名前付きシステム ミューテックスはオペレーティング システム全体から参照でき、プロセスの動作を同期するために使用できます。 名前付きシステム ミューテックスを表す Mutex オブジェクトを作成するには、名前を指定できるコンストラクターを使用します。 オペレーティング システム オブジェクトを同時に作成することもできます。または、Mutex オブジェクトの作成前から存在する場合もあります。 同じ名前付きシステム ミューテックスを表す複数の Mutex オブジェクトを作成できます。また、OpenExisting メソッドを使用して、既存の名前付きシステム ミューテックスを開くことができます。

メモメモ

ターミナル サービスを実行中のサーバーでは、名前付きシステム ミューテックスには 2 つのレベルの参照範囲があります。 名前の先頭のプレフィックスが "Global\" の場合、そのミューテックスはすべてのターミナル サーバー セッションで参照できます。 名前の先頭のプレフィックスが "Local\" の場合、そのミューテックスは作成元のターミナル サーバー セッションでのみ参照できます。 その場合には、同じサーバー上の他のターミナル サーバー セッションのそれぞれで、同じ名前を持つ別のミューテックスが存在できます。 名前付きミューテックスを作成するときにプレフィックスを指定しなかった場合、プレフィックスは "Local\" になります。 同じターミナル サーバー セッション内の 2 つのミューテックスで、名前のプレフィックスのみが異なる場合、それらは別個のミューテックスであり、そのターミナル サーバー セッションのすべてのプロセスからどちらも参照できます。 つまり、"Global\" と "Local\" というプレフィックスが表すのは、ターミナル サーバー セッションに対する相対的なミューテックス名のスコープです。プロセスに対する相対的なスコープではありません。

メモメモ

この型またはメンバーに適用される HostProtectionAttribute 属性の Resources プロパティの値は、Synchronization | ExternalThreading です。 HostProtectionAttribute は、デスクトップ アプリケーション (通常、アイコンのダブルクリック、コマンドの入力、またはブラウザーへの URL の入力により起動されます) には影響しません。 詳細については、HostProtectionAttribute クラスのトピックまたは「SQL Server プログラミングとホスト保護属性」を参照してください。

ローカル Mutex オブジェクトを使用して、保護されたリソースへのアクセスを同期する方法を次の例に示します。


// This example shows how a Mutex is used to synchronize access
// to a protected resource. Unlike Monitor, Mutex can be used with
// WaitHandle.WaitAll and WaitAny, and can be passed across
// AppDomain boundaries.

using System;
using System.Threading;

class Test
{
    // Create a new Mutex. The creating thread does not own the
    // Mutex.
    private static Mutex mut = new Mutex();
    private const int numIterations = 1;
    private const int numThreads = 3;

    static void Main()
    {
        // Create the threads that will use the protected resource.
        for(int i = 0; i < numThreads; i++)
        {
            Thread myThread = new Thread(new ThreadStart(MyThreadProc));
            myThread.Name = String.Format("Thread{0}", i + 1);
            myThread.Start();
        }

        // The main thread exits, but the application continues to
        // run until all foreground threads have exited.
    }

    private static void MyThreadProc()
    {
        for(int i = 0; i < numIterations; i++)
        {
            UseResource();
        }
    }

    // This method represents a resource that must be synchronized
    // so that only one thread at a time can enter.
    private static void UseResource()
    {
        // Wait until it is safe to enter.
        mut.WaitOne();

        Console.WriteLine("{0} has entered the protected area", 
            Thread.CurrentThread.Name);

        // Place code to access non-reentrant resources here.

        // Simulate some work.
        Thread.Sleep(500);

        Console.WriteLine("{0} is leaving the protected area\r\n", 
            Thread.CurrentThread.Name);

        // Release the Mutex.
        mut.ReleaseMutex();
    }
}


.NET Framework

サポート対象: 4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

サポート対象: 4、3.5 SP1

Windows 7, Windows Vista SP1 以降, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core はサポート対象外), Windows Server 2008 R2 (SP1 以降で Server Core をサポート), Windows Server 2003 SP2

.NET Framework では、各プラットフォームのすべてのバージョンはサポートしていません。 サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。

この型は、スレッド セーフです。

表示: