c# - 如何避免 .NET 中的死锁

标签 c# multithreading deadlock .net

是否有任何通用的做法或规则可以避免程序中出现死锁? CLR 或语言/框架的任何工具是否也支持处理这种情况?

最佳答案

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

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

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

更一般地说,避免过度粒度的锁在这里可以成为一个巨大的理智保护者。对于可能竞争的锁对象,请认真考虑只对这两个概念使用一个锁。在许多情况下,这不会对花在比赛上的时间产生巨大影响,但会使代码更简单、更可靠。

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

关于c# - 如何避免 .NET 中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11815725/

相关文章:

c# - 在 C#/Asp.Net 中确定 IIS 服务器上的 "user logout"的最佳方法是什么?

c# - 等待线程问题

java - java对象结构的线程安全发布?

java - 使用ASM检测可能的同步死锁

c++ - 为什么要把 std::lock 放在 std::lock_guard 之前

c# - 如何从连接字符串中获取值?

c# - 获取扩展方法的 MethodInfo

multithreading - JBoss netty : How can I integrate a Telnet connection in a separate thread?

multithreading - 我是否需要一个线程安全的字符串列表来防止这种情况下的死锁?

c# - 使用客户端证书身份验证连接到 Web 服务