2013-04-15 94 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