【问题标题】:lock state if thread dies [duplicate]如果线程死亡,则锁定状态[重复]
【发布时间】:2016-08-02 05:07:08
【问题描述】:

我在 SO 和网络上寻找答案,但只找到了其他语言(c++、python)的答案,并且阅读并没有提供足够清晰的答案。

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

如:

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

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

如果线程 A 死掉而线程 B 尝试调用 foobar,它可以吗?还是会死机?

【问题讨论】:

  • “我已经在 SO 和网络上寻找答案” - 尝试在您最喜欢的搜索引擎中查找“c# lock exception”。
  • 已编辑。我不相信这是重复的。我已经删除了异常部分,并且更感兴趣的是如果线程本身在锁中死亡时会发生什么,没有异常。如果线程被杀死,锁会被释放吗?

标签: c# multithreading locking


【解决方案1】:

声明

lock(myLock)
{
    //code
}

等价于

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

所以如果一个线程死了,就会抛出异常,finally 语句会释放对象myLock 的锁。

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

【讨论】:

    【解决方案2】:

    lock语句转换为try-finally,组合Monitor.Enter Monitor.Exit如下图,finally在发生或不发生异常时都执行,保证锁被释放。来自Eric Lippertanswer 解释了c# 中的锁实现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多