是否有任何通用的做法或规则可以避免程序中出现死锁? CLR 或语言/框架的任何工具是否也支持处理这种情况?
最佳答案
请注意,其中很少有特定于 .net 的:
避免死锁的最大方法是以一致的顺序锁定;这意味着您会定期阻塞而不是死锁,但是需要对要锁定的内容和时间进行大量的思考和计划。当然,无论如何,这种思考和规划都是必要的。
实现这一点的一个简单方法是:尝试一次只需要一个锁对象;因此,您不是锁定 A 和 B,而是(分别)锁定 A then B。这也需要思考和计划,但通常是可以实现的。
更一般地说,避免过度粒度的锁在这里可以成为一个巨大的理智保护者。对于可能竞争的锁对象,请认真考虑只对这两个概念使用一个锁。在许多情况下,这不会对花在比赛上的时间产生巨大影响,但会使代码更简单、更可靠。
实际上,我对该语言的一个提示是“获取锁但有超时”比“获取锁”太多代码密集。确保始终有超时还可以确保总 锁定变得可恢复。但这应该主要用于识别以错误的顺序锁定的区域,以便您可以修复它们。
关于c# - 如何避免 .NET 中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11815725/