2013-04-15 93 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的調用必須由線程自己完成。在你的代碼中,這是由主線程在設置兩個線程的過程中完成的。而且,這需要成爲同一個對象的監視器,而不是像你的情況那樣的兩個不同的對象。

要解決這個問題,你需要將Enter/Exit移動到線程進入委託,並添加一個共同目標的顯示器,像這樣:

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(); 

現在t線程將無法撥打Met1,而Met2正在進行,反之亦然。

1

您正在使用兩個不同的顯示器。如果你想同步,使用相同的顯示器。我還建議在線程以外的對象上使用監視器(例如,將一個新對象本身作爲一個鎖)。此外,請考慮在C#中使用鎖定語句,該語句爲您封裝相同的代碼,並負責處理其他陷阱(例如異常)。

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

dasblinkenlight的迴應還指出,需要進入/退出從監視器線程自己。考慮他的答案優於我的答案。 – Ameen