2012-08-05 124 views
2

是否有任何常见的惯例或规则可以避免程序中的死锁? CLR还是来自语言/框架的任何工具的支持来处理这种情况?如何在.NET中避免死锁

+6

“按顺序锁定事物”是否包含在内? – 2012-08-05 10:39:10

+1

很难限制回答“只是避免穿线”。 – 2012-08-05 10:41:35

+0

对不起,我只是想知道我是否可以遵循一些规则来避免这些问题(例如,不要锁定这个问题)。 – user854301 2012-08-05 11:08:06

回答

1

我想你去走一走问题的最佳方法是使用控制的正常过程。使用Mutexes或Semaphores保护对资源的访问。

这可以帮助你

http://msdn.microsoft.com/en-us/library/hw29w7t1(v=vs.71).aspx

+3

我看不出以任何方式改变了问题;这是相同的问题,但是使用操作系统管理的锁定原语。您可以像使用互斥/信号量一样轻松地实现死锁。 – 2012-08-05 10:52:19

+0

是的你是对的,实际上互斥和信号量是造成僵局的原因。我想避免它的唯一方法是非常好地规划代码访问资源的方式。 – j0N45 2012-08-05 11:15:34

12

注意一点,这是.NET的具体:

避免死锁最大的方式是锁在一个一致的顺序;这意味着你会定期阻止而不是陷入僵局,但需要对你正在锁定什么以及什么时候进行多少思考和规划。无论如何,这个想法和计划是必要的。

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

从更一般的角度来看,避免过度锁定可能是一个巨大的理智保护。对于可能竞争的锁对象,请认真考虑只为这两个概念使用单个锁。在很多情况下,这不会对竞争时间产生巨大影响,但会使代码更加简单和可靠。

实际上,我对语言的一个抱怨是“带锁但带超时”是这么多的代码密集度比“带锁”要多得多。确保你总是有超时也可以确保一个总锁变得可恢复。但是这应该主要用于识别以错误的顺序锁定的区域,以便您可以修复它们。

+0

我很感谢你的回答。 – user854301 2012-08-05 19:07:17