如何找出死锁并在C#中防止死锁

Lea*_*ner 19 .net c# asp.net deadlock c#-4.0

我在5分钟后接受采访,我没有回答3个问题,有人可以帮助我.

题:

如何在多线程应用程序函数中查找死锁场景并防止它?

我给的答案:

我给出了死锁和锁,mutex,监视器,信号量的定义.他告诉我,这些是工具,但是如何寻找死锁场景,因为当我们盲目地使用这些工具时,它会花费他所说的性能:(

请帮我理解这个.

Gaʀ*_*ʀʀʏ 10

听起来你在解释死锁如何发生以及如何防止它们时遇到了问题.

当两个(最少两个)线程中的每一个尝试获取已被另一个锁定的资源上的锁时,就会发生死锁.在资源1上锁定的线程1尝试获取资源2上的锁.同时,线程2在资源2上有一个锁并且它尝试获取资源1上的锁.两个线程永远不会放弃它们的锁,因此发生了DEADLOCK .

避免死锁的最简单方法是使用超时值.Monitor类(system.Threading.Monitor)可以在获取锁定期间设置超时.

try{
    if(Monitor.TryEnter(this, 500))
    {
        // critical section
    }
}
catch (Exception ex)
{

}
finally
{
    Monitor.Exit();
}
Run Code Online (Sandbox Code Playgroud)

阅读更多


Cor*_*Doe 5

性能分析工具还可以帮助您识别死锁。该问题将提供有关此主题的一些见解:用于查找争用条件/死锁的C#/。NET分析工具

对代码进行可视化分析并正确使用锁也很有用(您应该能够在检查代码时发现代码中的潜在问题),但是对于复杂的应用程序可能非常困难。有时,只有在您运行代码时才看到死锁,而不仅仅是检查代码。

我对你的面试官不太了解。有些人可能想看看您对锁定标准/指南有多少了解,有些人可能想看看您是否知道如何使用工具,有些人可能两者都想。例如,在我工作的公司中,工具的使用(尤其是我们已经拥有和使用的工具)受到高度赞赏。但这并不意味着一个人不应该具有可以防止编码死锁的技能。

仅出于锁定目的而锁定某些对象会影响性能,因为线程会彼此等待。您必须分析工作流以确定什么时候真正需要锁定什么类型的锁定(简单lock或可能是ReaderWriterLockSlim)。有许多防止死锁的典型方法。

例如,在使用ReaderWriterLockSlim时可以使用超时来防止死锁(如果等待太久,就会放弃获取锁)

if (cacheLock.TryEnterWriteLock(timeout))
{
...
}
Run Code Online (Sandbox Code Playgroud)

而且您应该能够建议此类超时。

在这样的问题上,我至少希望提到死锁的经典情况,例如严重使用嵌套锁(您应该能够知道是否可以避免使用它们,为什么坏了等等)。

主题非常大……您可以继续进行下去。但是没有定义。知道什么是锁和知道在大型多线程应用程序中使用锁/信号灯/互斥锁是两件事。