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)
性能分析工具还可以帮助您识别死锁。该问题将提供有关此主题的一些见解:用于查找争用条件/死锁的C#/。NET分析工具。
对代码进行可视化分析并正确使用锁也很有用(您应该能够在检查代码时发现代码中的潜在问题),但是对于复杂的应用程序可能非常困难。有时,只有在您运行代码时才看到死锁,而不仅仅是检查代码。
我对你的面试官不太了解。有些人可能想看看您对锁定标准/指南有多少了解,有些人可能想看看您是否知道如何使用工具,有些人可能两者都想。例如,在我工作的公司中,工具的使用(尤其是我们已经拥有和使用的工具)受到高度赞赏。但这并不意味着一个人不应该具有可以防止编码死锁的技能。
仅出于锁定目的而锁定某些对象会影响性能,因为线程会彼此等待。您必须分析工作流以确定什么时候真正需要锁定什么类型的锁定(简单lock或可能是ReaderWriterLockSlim)。有许多防止死锁的典型方法。
例如,在使用ReaderWriterLockSlim时可以使用超时来防止死锁(如果等待太久,就会放弃获取锁)
if (cacheLock.TryEnterWriteLock(timeout))
{
...
}
Run Code Online (Sandbox Code Playgroud)
而且您应该能够建议此类超时。
在这样的问题上,我至少希望提到死锁的经典情况,例如严重使用嵌套锁(您应该能够知道是否可以避免使用它们,为什么坏了等等)。
主题非常大……您可以继续进行下去。但是没有定义。知道什么是锁和知道在大型多线程应用程序中使用锁/信号灯/互斥锁是两件事。
| 归档时间: |
|
| 查看次数: |
24725 次 |
| 最近记录: |