线程被锁住了
本文关键字:锁住 线程 | 更新日期: 2023-09-27 18:14:57
我有以下场景:
一个由3个线程组成的线程池,每个线程都应该从一个包含9个操作的列表中随机选择。在这九个操作之间,有两个不能同时执行,所以我在这两个方法(操作)中使用了锁,如下所示:
private Object lockThis6 = new Object();
private Object lockThis7 = new Object();
public void OpSix(uSupervisor supervisor)
{
lock (lockThis6)
{
try
{
//Intructions
//Event Handler
OnOpFinished(supervisor);
}
catch
{
}
}
}
public void OpSeven(uSupervisor supervisor)
{
lock (lockThis7)
{
try
{
//Intructions
//Event Handler
OnOpFinished(supervisor);
}
catch
{
}
}
}
//EventHandler
protected virtual void OnOpFinished(uSupervisor supervisor)
{
if (OpFinished != null)
OpFinished(this, new EventLoad(supervisor));
}
在指令的最后,引发一个事件来"通知"线程随机选择一个操作。奇怪的是,有时线程会卡在锁语句中,我试图找出它是否是死锁场景,但事实并非如此
我的代码中的问题是在事件处理程序。由于事件处理程序是在Lock语句中调用的,因此对于选择该操作的任何其他线程,Lock将始终处于锁定状态。
只需将事件处理程序移出锁语句即可解决我的问题。