multithreading - 复杂系统中的死锁预防

标签 multithreading concurrency deadlock

假设我有一个有 7 个进程和 3 个资源 A、B、C 的系统。假设每个进程都需要读写 {A, B, C} 的不同非空子集,如何有效防止死锁?即不能将互斥体放在 3 个资源上作为一个整体。

最佳答案

如果互斥体支持非阻塞获取(通常称为 trylock),则可以在没有锁排序/层次结构的情况下实现避免死锁的解决方案。算法如下:

  1. 获取第一个资源的锁;这里允许等待。
  2. 获取第一个锁后,尝试使用 try-lock 获取另一个锁。
  3. 如果 try-lock 失败(表明资源正忙),则释放之前获取的所有锁并转到步骤 1。
  4. 如果尝试锁定成功,请对所有剩余资源重复第 2 步。

通过非阻塞获取(如果已经持有锁,则永远不要等待)和合作(做个好邻居,如果无法在不阻塞的情况下继续操作,则释放已获取的任何内容)来避免死锁。

这样的策略用于例如Boost 一次获取多个锁。实际上,在 Boost 中,它甚至更高级:在第 3 步释放锁后,它们开始等待上次尝试时繁忙的锁。

另外,看看这些 SO 主题:Acquire a lock on two mutexes and avoid deadlock , Multiple mutex locking strategies and why libraries don't use address comparison

关于multithreading - 复杂系统中的死锁预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26509607/

相关文章:

django - Apache mod_wsgi django启用多线程多进程

c - 使用C中的线程表示路由表-作业任务

iOS 应用程序意外中断。多线程问题(可能)

java - 如何以安全高效的方式使用 AtomicReference 进行惰性创建和设置?

.net - 终止 .NET 4 TPL 中的死锁任务

java - 多线程中的套接字 "deadlocked"Java

multithreading - 这个 Go 代码是线程安全的还是我需要一个互斥体?

java - Concurrency runInBackground方法逻辑实战[9.3.2]

java - 在 spring bean 中访问 Db 时的线程安全

linux - 我的信号量模块没有正常工作(餐饮哲学家)