2013-04-15 1 views
3

멀티 스레드 응용 프로그램이 있습니다.스레드 동기화 C#

내가 동기화하려고/스레드 안전이

static void Main(string[] args) 
{ 
    Thread t = new Thread(()=>Met1(x)); 
    Monitor.Enter(t); 
    t.start(); 
    Monitor.Exit(t); 

    Thread t2 = new Thread(()=>Met2(x,y)); 
    Monitor.Enter(t2); 
    t2.start(); 
    Monitor.Exit(t2); 
} 

그러나 스레드로부터 안전하지 않습니다 응용 프로그램이/동기화.

+0

여기 스레딩 좋은 소개있다 : ['Albahari'은] (http://www.albahari.com/threading/) –

답변

3

Monitor.EnterMonitor.Exit의 호출은 스레드 자체로 수행되어야합니다. 코드에서이 작업은 두 스레드를 설정하는 과정에서 주 스레드에 의해 수행됩니다. 또한, 그것은 같은 개체의 모니터가 될 필요가 아니라 두 가지 다른 개체가 귀하의 경우입니다. 이제 t 스레드 수 없을 것

object mon = new object(); 
Thread t = new Thread(()=>{ 
    Monitor.Enter(mon); 
    Met1(x); 
    Monitor.Exit(mon); 
}); 
Thread t2 = new Thread(()=>{ 
    Monitor.Enter(mon); 
    Met2(x,y); 
    Monitor.Exit(mon); 
}); 
t.start(); 
t2.start(); 

을 :

는이 문제를 해결하려면 다음과 같이 대리자로 스레드 위에 Enter/Exit을 이동하고, 모니터를위한 공통 객체를 추가 할 필요가 Met2이가는 동안 Met1으로 전화하고 그 반대의 경우도 마찬가지입니다.

1

두 개의 서로 다른 모니터를 사용하고 있습니다. 동기화를 원할 경우 동일한 모니터를 사용하십시오. 또한 스레드가 아닌 다른 객체 (예 : 새로운 객체 자체를 자물쇠로 사용)의 모니터를 사용하는 것이 좋습니다. 또한 C#에서 lock 문을 사용하면 동일한 코드를 래핑하고 다른 문제도 처리합니다 (예를 들어 예외).

object synchronizationLock = new object(); 
lock (synchronizationLock) 
{ 
    // Place logic here 
} 
+0

dasblinkenlight의 반응 또한/입력에서 모니터를 종료 할 필요가 있다고 지적 스레드 자체. 그의 대답이 내 것보다 우월하다고 생각하십시오. – Ameen