2009-04-13 12 views
4

次のプログラムを印刷:それは、リソースの排他的ロックを獲得することができないことを意味排他ロックを取得できないのはなぜですか?

Entered 3 
Entered 4 
Wait for Exited messages 
Exited 3 
Exited 4 

。どうして?

public class Worker 
    { 
     public void DoIt(object resource) 
     { 
      Monitor.Enter(resource); 
      Console.WriteLine("Entered " + Thread.CurrentThread.ManagedThreadId); 
      Thread.Sleep(3000); 
      Monitor.Exit(resource); 
      Console.WriteLine("Exited " + Thread.CurrentThread.ManagedThreadId); 
     } 
    } 

    class Program 
    { 
     struct Resource 
     { 
      public int A; 
      public int B; 
     } 

     static void Main(string[] args) 
     { 
      Resource resource; 
      resource.A = 0; 
      resource.B = 1; 

      var a = new Worker(); 
      var b = new Worker(); 

      var t1 = new Thread(() => a.DoIt(resource)); 
      var t2 = new Thread(() => b.DoIt(resource)); 

      t1.Start(); 
      t2.Start(); 

      Console.WriteLine("Wait for Exited messages"); 
      Console.ReadLine(); 
     } 
    } 

答えて

10

Resourceは構造体です。 DoItに渡されると囲まれているので、DoItを呼び出すたびに別のオブジェクトがロックされます。 Resourceをクラスに変更します。

関連する問題