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

Mutex クラス

 

公開日: 2016年10月

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

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

System.Object
  System.MarshalByRefObject
    System.Threading.WaitHandle
      System.Threading.Mutex

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

名前説明
System_CAPS_pubmethodMutex()

Mutex クラスの新しいインスタンスを、既定のプロパティを使用して初期化します。

System_CAPS_pubmethodMutex(Boolean)

呼び出し元のスレッドにミューテックスの初期所有権があるかどうかを示すブール値を使用して、Mutex クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodMutex(Boolean, String)

呼び出し元のスレッドにミューテックスの初期所有権があるかどうかを示すブール値と、ミューテックスの名前を表す文字列を使用して、Mutex クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodMutex(Boolean, String, Boolean)

呼び出し元のスレッドにミューテックスの初期所有権があるかどうかを示すブール値、ミューテックスの名前を表す文字列、およびメソッドから戻るときにミューテックスの初期所有権が呼び出し元のスレッドに付与されたかどうかを示すブール値を指定して、Mutex クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodMutex(Boolean, String, Boolean, MutexSecurity)

呼び出し元のスレッドにミューテックスの初期所有権があるかどうかを示すブール値、ミューテックスの名前を表す文字列、メソッドが戻るときにミューテックスの初期所有権が呼び出し元のスレッドに付与されたかどうかを示すブール値変数、および名前付きミューテックスに適用するアクセス制御セキュリティを指定して、Mutex クラスの新しいインスタンスを初期化します。

名前説明
System_CAPS_pubpropertyHandle

互換性のために残されています。ネイティブ オペレーティング システム ハンドルを取得または設定します。(WaitHandle から継承されます。)

System_CAPS_pubpropertySafeWaitHandle

ネイティブ オペレーティング システム ハンドルを取得または設定します。(WaitHandle から継承されます。)

名前説明
System_CAPS_pubmethodClose()

現在の WaitHandle によって保持されているすべてのリソースを解放します。(WaitHandle から継承されます。)

System_CAPS_pubmethodCreateObjRef(Type)

リモート オブジェクトとの通信に使用するプロキシの生成に必要なすべての関連情報を格納しているオブジェクトを作成します。(MarshalByRefObject から継承されます。)

System_CAPS_pubmethodDispose()

WaitHandle クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。(WaitHandle から継承されます。)

System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されます。)

System_CAPS_pubmethodGetAccessControl()

名前付きミューテックスのアクセス制御セキュリティを表す MutexSecurity オブジェクトを取得します。

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されます。)

System_CAPS_pubmethodGetLifetimeService()

このインスタンスの有効期間ポリシーを制御する現在の有効期間サービス オブジェクトを取得します。(MarshalByRefObject から継承されます。)

System_CAPS_pubmethodGetType()

現在のインスタンスの Type を取得します。(Object から継承されます。)

System_CAPS_pubmethodInitializeLifetimeService()

このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。(MarshalByRefObject から継承されます。)

System_CAPS_pubmethodSystem_CAPS_staticOpenExisting(String)

既に存在する場合は、指定した名前付きミューテックスを開きます。

System_CAPS_pubmethodSystem_CAPS_staticOpenExisting(String, MutexRights)

既に存在する場合は、必要なセキュリティ アクセスで指定した名前付きミューテックスを開きます。

System_CAPS_pubmethodReleaseMutex()

Mutex を一度解放します。

System_CAPS_pubmethodSetAccessControl(MutexSecurity)

名前付きシステム ミューテックスのアクセス制御セキュリティを設定します。

System_CAPS_pubmethodToString()

現在のオブジェクトを表す文字列を返します。(Object から継承されます。)

System_CAPS_pubmethodSystem_CAPS_staticTryOpenExisting(String, Mutex)

既に存在する場合は、指定した名前付きミューテックスを開き操作が成功したかどうかを示す値を返します。

System_CAPS_pubmethodSystem_CAPS_staticTryOpenExisting(String, MutexRights, Mutex)

既に存在する場合は、必要なセキュリティ アクセスを使用して指定した名前付きミューテックスを開き、操作が成功したかどうかを示す値を返します。

System_CAPS_pubmethodWaitOne()

現在の WaitHandle がシグナルを受け取るまで、現在のスレッドをブロックします。(WaitHandle から継承されます。)

System_CAPS_pubmethodWaitOne(Int32)

32 ビット符号付き整数を使用して時間間隔をミリ秒単位で指定し、現在の WaitHandle がシグナルを受信するまで、現在のスレッドをブロックします。(WaitHandle から継承されます。)

System_CAPS_pubmethodWaitOne(Int32, Boolean)

現在の WaitHandle がシグナルを受信するまで現在のスレッドをブロックします。時間間隔を指定するために 32 ビット符号付き整数を使用し、待機の前でも同期ドメインを終了するかどうかを指定します。(WaitHandle から継承されます。)

System_CAPS_pubmethodWaitOne(TimeSpan)

TimeSpan を使用して時間間隔を指定し、現在のインスタンスがシグナルを受信するまで現在のスレッドをブロックします。(WaitHandle から継承されます。)

System_CAPS_pubmethodWaitOne(TimeSpan, Boolean)

現在のインスタンスがシグナルを受信するまで現在のスレッドをブロックします。TimeSpan を使用して時間間隔を指定し、待機の前でも同期ドメインを終了するかどうかを指定します。(WaitHandle から継承されます。)

名前説明
System_CAPS_pubmethodGetSafeWaitHandle()

ネイティブのオペレーティング システムの待機ハンドルのセーフ ハンドルを取得します。(WaitHandleExtensions によって定義されています。)

System_CAPS_pubmethodSetSafeWaitHandle(SafeWaitHandle)

ネイティブのオペレーティング システムの待機ハンドルのセーフ ハンドルを設定します。(WaitHandleExtensions によって定義されています。)

System_CAPS_noteメモ

この型の .NET Framework ソース コードを参照してください、 Reference Sourceします。 ソース コードをオンラインで参照、オフライン表示のリファレンスをダウンロードおよびデバッグ中にソース (パッチや更新を含む) をステップsee instructions.

2 つまたは複数のスレッドは、同時に共有リソースにアクセスする必要がある場合、システムは、一度に 1 つのスレッドがリソースを使用していることを確認する同期メカニズムが必要です。 Mutex 同期は 1 つのスレッドを共有リソースへの排他アクセスを許可するプリミティブです。 スレッドがミュー テックス、最初のスレッドがミュー テックスを解放するまで、ミュー テックスを取得する必要のある 2 番目のスレッドが中断されます。

System_CAPS_important重要

この型は、 IDisposable インターフェイスです。 型の使用が完了したらを直接または間接的にその破棄する必要があります。 型の直接 dispose を呼び出してその Dispose メソッドで、 try/catch ブロックします。 直接ことのない破棄する場合など言語構成要素を使用して using (c#) のまたは Using (Visual Basic で)。 詳細については、"を使用して、オブジェクトを実装して IDisposable"」セクションを参照してください、 IDisposable インターフェイスに関するトピック。

使用することができます、 WaitHandle.WaitOne ミュー テックスの所有権を要求します。 呼び出し元のスレッド、次のいずれかが発生するまでをブロックします。

  • ミュー テックスは、所有されていないことを示すために通知されます。 この場合、 WaitOne メソッドを返します。 true, 、呼び出し元のスレッドがミュー テックスの所有権と、ミュー テックスで保護されているリソースにアクセスするとします。 これには、リソースへのアクセスが完了したら、スレッドで呼び出す必要があります、 ReleaseMutex 、ミュー テックスの所有権を解放します。 例では、最初の例では、このパターンを示します。

  • 呼び出しで指定されたタイムアウト期間、 WaitOne メソッドを持つ、 millisecondsTimeout または timeout パラメーターの有効期限が経過します。 このような場合、 WaitOne メソッドを返します。 false, 、呼び出し元のスレッドにミュー テックスの所有権取得を試行ではありません。 この場合、呼び出し元のスレッドにミュー テックスで保護されているリソースへのアクセスが拒否されるように、コードを構成する必要があります。 スレッドがミュー テックスの所有権を取得することはありませんのでを呼び出してはならない、 ReleaseMutex メソッドです。 例では、2 番目の例では、このパターンを示します。

Mutex クラスは、取得したスレッドでのみ、ミュー テックスが解放できるように、スレッド id を強制します。 これに対し、 Semaphore クラスがスレッド id を適用しません。 ミュー テックスは、アプリケーション ドメインの境界を越えて渡すこともできます。

ミュー テックスを所有するスレッドは、繰り返しの呼び出しで同じミュー テックスを要求できる WaitOne の実行をブロックすることがなく。 ただし、スレッドを呼び出す必要があります、 ReleaseMutex メソッド、同じ回数、ミュー テックスの所有権を解放します。

Mutex クラスから継承 WaitHandle, 、静的なを呼び出すこともできます WaitHandle.WaitAllWaitHandle.WaitAny 保護されたリソースへのアクセスを同期する方法です。

ミュー テックスを所有しているスレッドが終了した場合、ミュー テックスを破棄するメンバーといいます。 ミュー テックスの状態は、シグナル状態に設定し、次の待機中のスレッドが所有権を取得します。 .NET Framework version 2.0 以降、 AbandonedMutexException 放棄されたミュー テックスを取得し、次のスレッドでスローされます。 .NET Framework version 2.0 の前に例外がスローされなかった。

System_CAPS_caution注意

ミュー テックスの破棄には、コードで重大なエラーが多くの場合を示します。 ミュー テックスを解放しないままスレッドの終了時に、ミュー テックスによって保護されていたデータ構造を一貫性のある状態で可能性がありますできません。 ミュー テックスの所有権を要求する次のスレッドでは、この例外を処理でき、データ構造の整合性を検証できる場合、続行することができます。

システム全体のミュー テックス、ミュー テックスの破棄は可能性があります (たとえば、Windows タスク マネージャーを使用して) をアプリケーションが突然終了されたことを示します。

ミュー テックスは、次の 2 種類: はであり、名前付きシステム ミュー テックス ローカル ミュー テックスです。 ローカル ミュー テックスは、プロセス内でのみ存在します。 任意のスレッドから参照されて、プロセスのために使用できる、 Mutex 、ミュー テックスを表すオブジェクト。 名前のない各 Mutex オブジェクトは、別のローカル ミュー テックスを表します。

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

System_CAPS_noteメモ

ターミナル サービスを実行するサーバーで名前付きシステム ミュー テックス 2 レベルの可視性のことができます。 その名前は、プレフィックス「global \」で始まっている場合、ミュー テックスはすべてのターミナル サーバー セッションに表示されます。 その名前は、プレフィックス"Local\"で始まっている場合、ミュー テックスは、ターミナル サーバー セッションでのみが作成されました。 その場合は、同じ名前の別のミュー テックスは、それぞれのサーバー上の他のターミナル サーバー セッションに存在できます。 名前付きミュー テックスを作成するときに、プレフィックスを指定しないと、なります、プレフィックス"Local\"。 ターミナル サーバー セッション内で名前のプレフィックスのみが異なる 2 つのミュー テックスが別個のミュー テックスにされ、両方が、ターミナル サーバー セッションですべてのプロセスに表示されます。 つまり、「global \」と"Local\"プレフィックス名では、プロセス相対的ではない、ターミナル サーバー セッションを基準としたミュー テックスの名前のスコープについて説明します。

この方法を示しますローカル Mutex オブジェクトを使用して、保護されたリソースへのアクセスを同期します。 それを呼び出す必要があります、ミュー テックスの所有権を取得するまで、各呼び出し元のスレッドがブロックされている、 ReleaseMutex 、スレッドの所有権を解放します。

using System;
using System.Threading;

class Example
{
    // 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 newThread = new Thread(new ThreadStart(ThreadProc));
            newThread.Name = String.Format("Thread{0}", i + 1);
            newThread.Start();
        }

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

    private static void ThreadProc()
    {
        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.
        Console.WriteLine("{0} is requesting the mutex", 
                          Thread.CurrentThread.Name);
        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", 
            Thread.CurrentThread.Name);

        // Release the Mutex.
        mut.ReleaseMutex();
        Console.WriteLine("{0} has released the mutex", 
            Thread.CurrentThread.Name);
    }
}
// The example displays output like the following:
//       Thread1 is requesting the mutex
//       Thread2 is requesting the mutex
//       Thread1 has entered the protected area
//       Thread3 is requesting the mutex
//       Thread1 is leaving the protected area
//       Thread1 has released the mutex
//       Thread3 has entered the protected area
//       Thread3 is leaving the protected area
//       Thread3 has released the mutex
//       Thread2 has entered the protected area
//       Thread2 is leaving the protected area
//       Thread2 has released the mutex

次の例では、各スレッドで、 WaitOne(Int32) 、ミュー テックスを取得します。 タイムアウト間隔が経過したかどうか、メソッドが返されます false, 、スレッドはミュー テックスを取得も、ミュー テックスを保護するリソースにアクセスするとします。 ReleaseMutex ミュー テックスを取得したスレッドによってのみ呼び出されます。

using System;
using System.Threading;

class Example
{
    // 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()
    {
        Example ex = new Example();
        ex.StartThreads();
    }

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

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

    private static void ThreadProc()
    {
        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, and do not enter if the request times out.
        Console.WriteLine("{0} is requesting the mutex", Thread.CurrentThread.Name);
        if (mut.WaitOne(1000)) {
           Console.WriteLine("{0} has entered the protected area", 
               Thread.CurrentThread.Name);

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

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

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

           // Release the Mutex.
              mut.ReleaseMutex();
           Console.WriteLine("{0} has released the mutex", 
                             Thread.CurrentThread.Name);
        }
        else {
           Console.WriteLine("{0} will not acquire the mutex", 
                             Thread.CurrentThread.Name);
        }
    }

    ~Example()
    {
       mut.Dispose();
    }
}
// The example displays output like the following:
//       Thread1 is requesting the mutex
//       Thread1 has entered the protected area
//       Thread2 is requesting the mutex
//       Thread3 is requesting the mutex
//       Thread2 will not acquire the mutex
//       Thread3 will not acquire the mutex
//       Thread1 is leaving the protected area
//       Thread1 has released the mutex

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
1.1 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Windows Phone Silverlight
7.1 以降で使用可能
Windows Phone
8.1 以降で使用可能

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

トップに戻る
表示: