gpt4 book ai didi

c# - lock 语句如何在不释放锁的情况下退出?

转载 作者:太空狗 更新时间:2023-10-30 00:12:46 42 4
gpt4 key购买 nike

我有一个奇怪的问题,一个死锁问题,如果我使用 Visual Studio 暂停程序并检查线程,我只能看到两个线程在等待锁。似乎没有线程在锁定范围内! Visual Studio 只是在撒谎,或者 lock 语句如何在不释放锁的情况下退出?

谢谢

最佳答案

在以下情况下可能会发生这种情况。假设你有

Enter();
try
{
Foo();
}
finally
{
Exit();
}

并且在 Enter 之后但在 try 之前抛出线程中止异常。现在已经进入了监视器,但是finally永远不会运行,因为在try之前抛出了异常。

我们已经在 C# 4 中修复了这个缺陷。在 C# 4 中,lock 语句现在生成为

bool mustExit = false;
try
{
Enter(ref mustExit);
Foo();
}
finally
{
if (mustExit) Exit();
}

当然,事情仍然会变得非常糟糕;中止一个线程并不能保证该线程永远中止、finally 阻塞永远运行等等。您可能会在未处理的异常事件处理程序中结束,但仍持有锁。但这至少好一点。

关于c# - lock 语句如何在不释放锁的情况下退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2418543/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com