Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程死锁_C#_Multithreading - Fatal编程技术网

C# 线程死锁

C# 线程死锁,c#,multithreading,C#,Multithreading,我有一个C语言的多线程程序。在实践中防止死锁的最佳方法是什么 是时间锁吗 另外,可以用来帮助检测和防止死锁的最佳工具是什么 非常感谢。这不是C语言特有的。你应该总是按照明确的顺序来学习。 互联网上有很多信息,比如,你可以看看这里 死锁通常发生在以下几种情况下: 您正在使用多个锁,但未按正确顺序锁定/解锁它们。因此,您可能会创建一个线程持有锁a并需要锁B,而另一个线程需要锁a并持有锁B的情况。这两个线程都不能继续。这是因为每个线程都以不同的顺序锁定 当使用可重入锁并将其锁定的次数超过解锁次数时。见

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

是时间锁吗

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


非常感谢。

这不是C语言特有的。你应该总是按照明确的顺序来学习。 互联网上有很多信息,比如,你可以看看这里
死锁通常发生在以下几种情况下:

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

当使用可重入锁并将其锁定的次数超过解锁次数时。见这一相关问题:

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

您有一个工作线程轮询标志以知道何时停止。主线程设置标志并尝试加入工作线程,但您忘记了将标志设置为易失性


只有一个好工具,在你的耳朵之间。检测它从来都不难。避免死锁的最好方法就是不要使用锁!否则,要小心!有一些经验法则可以提供适度的帮助,比如总是以相同的顺序获得。也应在设计中考虑。