【问题标题】:How to avoid deadlock in .NET如何避免 .NET 中的死锁
【发布时间】:2012-08-05 10:35:51
【问题描述】:

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

【问题讨论】:

  • “以一致的顺序锁定事物”算吗?
  • 很难抑制回答“只是避免线程”。
  • 抱歉表述不好,我只是想知道我是否可以遵循一些规则来避免此类问题(例如,不要锁定此问题)。

标签: c# multithreading deadlock .net


【解决方案1】:

请注意,其中很少是特定于 .net 的:

避免死锁的最大方法是以一致的顺序锁定;这意味着您会定期阻塞而不是死锁,但需要对您锁定的内容和时间进行大量思考和计划。当然,这个想法和计划无论如何都是必要的。

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

更笼统地说,避免过度粒度的锁在这里可以节省大量精力。对于可以竞争的锁对象,请认真考虑对这两个概念只使用一个锁。在许多情况下,这不会对比赛所花费的时间产生太大影响,但会使代码更简单、更可靠。

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

【讨论】:

    【解决方案2】:

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

    Avoiding and Detecting Deadlocks in .NET Apps with C# and C++

    【讨论】:

      【解决方案3】:

      我认为解决问题的最佳方法是使用正常的控制过程。使用互斥锁或信号量保护对资源的访问。

      这可能对你有帮助

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

      【讨论】:

      • 我认为这不会以任何方式改变问题;这是相同的问题,但使用操作系统管理的锁原语。您可以使用互斥锁/信号量轻松死锁。
      • 是的,你是对的,实际上互斥锁和信号量是导致死锁的原因。我想避免它的唯一方法是很好地计划代码访问资源的方式。
      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 2012-08-14
      • 1970-01-01
      • 2011-01-29
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多