线程被锁住了

本文关键字:锁住 线程 | 更新日期: 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将始终处于锁定状态。

只需将事件处理程序移出锁语句即可解决我的问题。