2009-04-13 2 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을 클래스로 변경하십시오.

관련 문제