是否有任何常见的做法或规则来避免程序中的死锁?还有来自 CLR 的任何支持或来自语言/框架的任何工具来处理这种情况吗?
问问题
12801 次
3 回答
12
请注意,其中很少是特定于 .net 的:
避免死锁的最大方法就是以一致的顺序锁定;这意味着您会定期阻塞而不是死锁,但需要对您锁定的内容和时间进行大量思考和计划。当然,这个想法和计划无论如何都是必要的。
实现此目的的一种简单方法是:尝试一次只需要一个锁对象;因此,不是锁定 A和B,而是(分别)锁定 A然后B。这也需要思考和计划,但通常是可以实现的。
更一般地说,避免过度粒度的锁在这里可能是一个巨大的理智保护者。对于可以竞争的锁对象,请认真考虑对这两个概念仅使用一个锁。在许多情况下,这并不会极大地影响花费在竞争上的时间,但会使代码更简单、更可靠。
实际上,我对该语言的一个抱怨是“获取锁但有超时”比“获取锁”更密集代码。确保您始终有超时也可以确保总锁定变得可恢复。但这应该主要用于识别以错误顺序锁定的区域,以便您可以修复它们。
于 2012-08-05T10:51:06.467 回答
8
MSDN 实际上有几篇关于这个主题的好文章,其中一篇是:
于 2012-08-05T10:40:05.620 回答
1
我认为解决问题的最佳方法是使用正常的控制过程。使用互斥锁或信号量保护对资源的访问。
这可能会帮助你
http://msdn.microsoft.com/en-us/library/hw29w7t1(v=vs.71).aspx
于 2012-08-05T10:49:43.270 回答