use*_*301 2 .net c# multithreading deadlock
是否有任何常见的做法或规则来避免程序中的死锁?还有来自CLR的任何支持或来自语言/框架的任何工具来处理这种情况吗?
Mar*_*ell 12
请注意,这一点很少.net特定:
避免死锁的最大方法是锁定一致的顺序 ; 这意味着你会得到常规的阻塞而不是死锁,但需要经过深思熟虑和规划你所锁定的内容以及何时锁定.当然,无论如何,这种思想和计划是必要的.
实现此目的的一种简单方法是:尝试一次只需要一个锁定对象; 因此,不是锁定A 和 B,而是锁定(单独)A 然后锁定B.这也需要思考和计划,但通常是可以实现的.
更一般地说,避免过度粒度锁定可以在这里节省大量的理智.对于可能竞争的锁定对象,要认真考虑使用两个概念的单个锁.在许多情况下,这不会对竞争所花费的时间产生巨大影响,但会使代码更简单,更可靠.
其实,一个抱怨我有与语言是"采取了锁,但一个超时"是这么多的更多的代码消耗比"采取锁".确保您始终有超时也可以确保完全锁定可以恢复.但这应该主要用于识别以错误顺序锁定的区域,以便您可以修复它们.