c++ - 为什么 `std::lock` 不使用全局排序锁定互斥锁?
问题描述
std::lock
并且std::scoped_lock
可用于锁定一系列互斥锁,同时避免死锁。显然,他们使用了一些由lock
s、try_lock
s 和s 组成的算法unlocks
来实现这一点。
std::lock
因为它应该更简单,所以不能std::scoped_lock
使用某种全局排序(例如它们的地址用&
)锁定互斥锁,因为当互斥锁总是以相同的顺序锁定时不会发生死锁?
解决方案
这可能会与其他算法陷入僵局。假设一个锁保护对象的集合,而另一个锁保护该集合中的单个对象。不调用的代码std::lock
将首先锁定集合,然后找到对象,然后想要获取保护该特定对象的锁。
如果使用了您的算法,那么如果对象中的代码std::lock
用于获取两个锁并且您的算法说在保护集合的锁之前获取保护对象的锁,会发生什么?它会陷入僵局。
推荐阅读
- python - Django:unique_together 用于外国领域
- javascript - JavaScript 加载器功能在 Firefox 中运行良好,但在 Chrome 中无法运行
- excel-formula - 删除重复的值并移动到另一个表
- reactjs - 如何在 React JS 的函数内部使用状态?
- oracle - 交互式网格在更新 (19.1) 时抛出 ORA-01858
- proxy - 代理服务器从 ODOO python 中的上游服务器收到无效响应
- ios - 如何使用 Firestore 数据库在 swift 中为 tableview 中的项目列表设置 postkey?
- javascript - 修复 Javascript 中的反射 XSS 问题。检查马克思
- linux - 加载共享库时出错:__vdso_time:dlopen() 的无效模式:无效参数
- python - 在 Idle (Python 3.7.4) 中输入 import nltk 后,我得到一个 ModuleNotFoundError: No module named "nltk"