2012-02-19 14 views
0
class Class1 
    { 
     private static object consoleGate = new Object(); 

     private static void Trace(string msg) 
     { 
      lock (consoleGate) 
      { 
       Console.WriteLine("[{0,3}/{1}]-{2}:{3}", Thread.CurrentThread.ManagedThreadId, 
        Thread.CurrentThread.IsThreadPoolThread ? "pool" : "fore", 
        DateTime.Now.ToString("HH:mm:ss.ffff"), msg); 
      } 
     } 
     private static void ProcessWorkItems() 
     { 
        lock (consoleGate) 
        { 
         for (int i = 0; i < 5; i++) 
         { 
          Trace("Processing " + i); 
          Thread.Sleep(250); 
         } 
        } 
      Console.WriteLine("Terminado."); 

     } 
     static void Main() 
     { 
      ProcessWorkItems(); Console.ReadLine(); 
     } 
    } 

出力:スレッドの同期:ここに競合がありますか?

Processing 0 
Processing 1 
Processing 2 
Processing 3 
Processing 4 
Terminated 

なぜこのコードの作品はありますか? ProcessWorkItems静的メソッドロックConsoleGateオブジェクトとトレースは同じでした。オブジェクトは一度しかロックできないと思った。 ¿いくつかの説明?

答えて

4

C#のロックはリエントラントです.1つのスレッドは、ブロックせずに同じロックを複数回取得できます。あなたはここに1つのスレッドしかありません。問題はありません。ロックは、複数のスレッドにわたるリソースへのアクセスを同期させるためのものです。 MSDN documentationlock上から

lockキーワードは別のスレッドがクリティカルセクションにありながら、一つのスレッドがコードのクリティカル セクションに入らないことを保証します。 別のスレッドがロックされたコードを入力しようとすると、オブジェクトが解放されるまでブロック を待つことになります。リエントラントロックの詳細については

このSOスレッドを参照してください。"What is the Re-entrant lock and concept in general?"

1

あなたがここに表示されているすべてのコードが同じスレッドで実行されています。そのため、「ロック」を使用していない場合と同じように動作します。

関連する問題