如何在.NET中避免死锁

3

有没有一些常见的操作或规则可以避免程序中的死锁?另外,CLR是否提供了相应的支持,或者语言/框架中是否有任何工具来处理这种情况?


6
“lock things in a consistent order”算吗? - undefined
1
很难抑制不回答“只需避免使用线程”。 - undefined
对于糟糕的表达,我很抱歉,我只是想知道是否可以遵循一些规则来避免这样的问题(例如,不要对此进行锁定)。 - undefined
3个回答

12
请注意,这里很少是与.NET相关的:
避免死锁最大的方法是以一致的顺序加锁;这意味着你会定期阻塞而不是死锁,但需要仔细考虑和计划何时以及对什么进行加锁。当然,这种思考和计划无论如何都是必要的。
一个简单的方法是:尽量只需要一个锁对象;所以不要同时加锁A和B,而是先分别加锁A,然后再加锁B。这也需要思考和计划,但通常是可行的。
更普遍地说,在此避免过度颗粒化的加锁,可以节省大量的心理健康。对于可能竞争的锁对象,请认真考虑只使用一个锁代表两个概念。在许多情况下,这并不会对竞争所花费的时间产生太大影响,但会使代码更简单、更可靠。
实际上,我对该语言的抱怨是,“带有超时的取锁”比“取锁”要复杂得多。确保您始终具有超时功能,也可以确保“总体”死锁变得可恢复。但这应该主要用于识别“以错误的顺序加锁”的区域,以便您可以进行修复。

8

1

3
这并没有改变问题的本质,只是使用了由操作系统管理的锁原语而已。你同样可能会因为使用互斥锁/信号量而导致死锁。 - undefined
是的,你说得对,实际上互斥锁和信号量是死锁的原因。我猜避免死锁的唯一方法就是很好地计划代码访问资源的方式。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接