如何避免.NET中的死锁

use*_*301 2 .net c# multithreading deadlock

是否有任何常见的做法或规则来避免程序中的死锁?还有来自CLR的任何支持或来自语言/框架的任何工具来处理这种情况吗?

Mar*_*ell 12

请注意,这一点很少.net特定:

避免死锁的最大方法是锁定一致的顺序 ; 这意味着你会得到常规的阻塞而不是死锁,但需要经过深思熟虑和规划你所锁定的内容以及何时锁定.当然,无论如何,这种思想和计划是必要的.

实现此目的的一种简单方法是:尝试一次只需要一个锁定对象; 因此,不是锁定A B,而是锁定(单独)A 然后锁定B.这也需要思考和计划,但通常是可以实现的.

更一般地说,避免过度粒度锁定可以在这里节省大量的理智.对于可能竞争的锁定对象,要认真考虑使用两个概念的单个锁.在许多情况下,这不会对竞争所花费的时间产生巨大影响,但会使代码更简单,更可靠.

其实,一个抱怨我有与语言是"采取了锁,但一个超时"是这么多的更多的代码消耗比"采取锁".确保您始终有超时也可以确保完全锁定可以恢复.但这应该主要用于识别以错误顺序锁定的区域,以便您可以修复它们.


Jus*_*ner 8

MSDN实际上有几篇关于这个主题的好文章,其中一篇是:

使用C#和C++避免和检测.NET应用程序中的死锁