3

我有一个多线程应用程序。

我正在尝试同步/线程安全

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

但是,应用程序不是线程安全/同步的。

4

2 回答 2

3

Monitor.Enterand的调用Monitor.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线程将无法在运行时调用Met1Met2反之亦然。

于 2013-04-15T01:25:15.750 回答
1

您正在使用两个不同的显示器。如果要同步,请使用相同的监视器。我还建议在线程以外的对象上使用监视器(例如,一个新对象本身作为锁)。此外,考虑在 C# 中使用 lock 语句,它为您包装相同的代码并处理其他问题(例如异常)。

object synchronizationLock = new object();
lock (synchronizationLock)
{
    // Place logic here
}
于 2013-04-15T01:26:46.857 回答