【问题标题】:C# threading deadlockC#线程死锁
【发布时间】:2012-01-18 05:15:26
【问题描述】:

我有一个 C# 中的多线程程序。在实践中防止死锁的最佳方法是什么?

是时间锁吗?

另外,什么是帮助检测和防止死锁的最佳工具?

非常感谢。

【问题讨论】:

  • 只有一个好工具,就是你耳朵之间的那个。检测它从来都不是难事。
  • 避免死锁的最好方法是不使用锁!做不到这一点,请谨慎使用!有一些经验法则会有所帮助,例如始终以相同的顺序获取。
  • Priority inversion 也应在设计中加以考虑。

标签: c# multithreading


【解决方案1】:

死锁通常发生在以下几种情况:

  1. 您正在使用多个锁,但未按正确顺序锁定/解锁它们。因此,您可能会创建一个线程持有锁 A 并需要锁 B,而另一个线程需要锁 A 并持有锁 B 的情况。它们都无法继续。这是因为每个线程都以不同的顺序锁定。

  2. 当使用重入锁并且锁定它的次数多于解锁它的次数时。请参阅此相关问题:why does the following code result in deadlock

  3. 当使用Monitor.Wait/Monitor.Pulse 作为信号机制时,但必须调用Wait 的线程在另一个线程调用Pulse 并且信号丢失时无法到达调用。您可以将AutoResetEvent 用于持久信号。

  4. 您有一个工作线程轮询标志以知道何时停止。主线程设置标志并尝试加入工作线程,但您忘记设置标志volatile。

【讨论】:

    【解决方案2】:

    它不是 C# 特定的。你应该总是以某种明确的顺序获得。 互联网上有很多信息,例如,你可以看看here http://www.javamex.com/tutorials/threads/deadlock.shtml

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2018-06-16
      相关资源
      最近更新 更多