C#线程死锁

时间:2012-01-18 05:15:27

标签: c# multithreading

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

是时间锁吗?

此外,有哪些可用于帮助检测和防止死锁的最佳工具?

非常感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

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