线程同步c#

本文关键字:同步 线程 | 更新日期: 2023-09-27 18:09:02

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

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

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

线程同步c#

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正在运行,反之亦然。

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

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