我在C#中有一个多线程程序。在实践中防止死锁的最佳方法是什么?
是时间锁吗?
此外,有哪些可用于帮助检测和防止死锁的最佳工具?
非常感谢。
答案 0 :(得分:2)
死锁通常发生在几种情况下:
您正在使用多个锁,而不是按正确的顺序锁定/解锁它们。因此,您可能会创建一个线程持有锁A并需要锁B的情况,另一个线程需要锁A并保持锁B.它们都不能继续。这是因为每个线程都以不同的顺序锁定。
使用重入锁定并锁定它的次数比解锁时多。请参阅此相关问题:why does the following code result in deadlock
使用Monitor.Wait/Monitor.Pulse
作为信令机制时,但是在另一个线程调用Wait
时,必须调用Pulse
的线程无法到达调用信号丢失了。您可以使用AutoResetEvent
获取持久信号。
您有一个工作线程轮询标志以知道何时停止。主线程设置标志并尝试加入工作线程,但是你忘了制作标志volatile
。
答案 1 :(得分:0)
这不是C#特有的。你应该总是以一些定义明确的顺序获得。 互联网上有很多信息,例如,你可以看看这里 http://www.javamex.com/tutorials/threads/deadlock.shtml