线程同步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);
}
Monitor.Enter
和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
线程将无法调用Met1
,而Met2
正在运行,反之亦然。
您正在使用两个不同的监视器。如果需要同步,请使用相同的监视器。我还建议在线程以外的对象上使用监视器(例如,将新对象本身作为锁)。此外,考虑在c#中使用lock语句,它为您包装了相同的代码,并处理了其他问题(例如异常)。
object synchronizationLock = new object();
lock (synchronizationLock)
{
// Place logic here
}