如果线程死亡则锁定状态

时间:2016-08-02 05:07:09

标签: c# multithreading locking

我已经环顾了SO和网络寻找答案,但只找到了其他语言(c ++,python)并且阅读并没有提供足够明确的答案。

如果一个线程有一个被锁定的代码块,并且该线程因为某种原因(强制被杀死)而在它处于锁定块内时会死亡,那么锁定是否仍会被强制执行(即其他线程不会被强制执行)能够使用获得那个锁?)

如:

class myClass {
    private static object myLock = new Object();

    public void foobar()
    { 
        lock(myLock)
        {
            //code
        }
    }
}

如果线程A死亡而线程B试图调用foobar,它能够吗?还是会陷入僵局?

2 个答案:

答案 0 :(得分:0)

使用组合Monitor.Enter Monitor.Exit将lock语句转换为try-finally,如下所示,最后在发生异常时执行,以确保锁定被释放。来自answerEric Lippert解释了c#中的锁实现。

System.Threading.Monitor.Enter(x);
try {
   ...
}
finally {
   System.Threading.Monitor.Exit(x);
}

答案 1 :(得分:0)

声明

lock(myLock)
{
    //code
}

相当于

System.Threading.Monitor.Enter(myLock);
try 
{ 
    //code
}
finally 
{ 
    System.Threading.Monitor.Exit(myLock); 
}

因此,如果线程死亡,则会抛出异常,finally语句将从对象myLock释放锁。

参见Monitor class的文档,它有关于锁定概念的很好的解释和示例。