假设我有一个有 7 个进程和 3 个资源 A、B、C 的系统。假设每个进程都需要读写 {A, B, C} 的不同非空子集,如何有效防止死锁?即不能将互斥体放在 3 个资源上作为一个整体。
最佳答案
如果互斥体支持非阻塞获取(通常称为 trylock),则可以在没有锁排序/层次结构的情况下实现避免死锁的解决方案。算法如下:
- 获取第一个资源的锁;这里允许等待。
- 获取第一个锁后,尝试使用 try-lock 获取另一个锁。
- 如果 try-lock 失败(表明资源正忙),则释放之前获取的所有锁并转到步骤 1。
- 如果尝试锁定成功,请对所有剩余资源重复第 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/