web-dev-qa-db-ja.com

C#のミューテックスとセマフォとは何ですか?どこに実装する必要がありますか?

C#のミューテックスとセマフォとは何ですか?どこに実装する必要がありますか?

マルチスレッドでそれらをどのように扱うことができますか?

19
Jaswant Agarwal

あなたはMSDNから始めるべきです。

  • System.Threading.Mutex :プロセス間同期にも使用できる同期プリミティブ。
  • System.Threading.Semaphore :リソースまたはリソースのプールに同時にアクセスできるスレッドの数を制限します。

通常、Mutexはプロセス間でのみ使用します。複数のアプリケーションが共有する必要のあるリソースがある場合、または単一インスタンスのアプリを構築する場合(つまり、一度に1つのコピーのみを実行できるようにする場合)。

セマフォを使用すると、特定の数の同時スレッドへのアクセスを制限できるため、たとえば、一度に最大2つのスレッドで特定のコードパスを実行できます。

30
bobbymcr

私はこれを読むことから始めます: http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials そして、投稿されたMSDNリンクbobbymcrでそれを強化します。

6
Ed Power

あなたはlockステートメントをチェックしたいかもしれません。 C#でスレッド同期タスクの大部分を処理できます

class Test {
    private static object Lock = new object();

    public function Synchronized()
    {
        lock(Lock)
        {
            // Only one thread at a time is able to enter this section
        }
    }
}

Lockステートメントは、Monitor.EnterおよびMonitor.Exitを呼び出すことによって実装されます。これは、次のコードと同等です。

Monitor.Enter(Lock);    
try
{
    // Only one thread at a time is able to enter this section
}
finally
{
    Monitor.Exit(Lock);
}
6
Pete