锁定多个 std::mutex 的最佳方法是什么?
What's the best way to lock multiple std::mutex'es?
注意:这个问题涉及c++ 11。在c++ 17(或更高版本)中,相同问题的答案可能已经改变。详情:
- std::lock_guard还是std::scoped_lock?
当我们想要锁定多个std::mutex
时,我们使用std::lock()
。但std::lock()
不提供RAII功能。
当我们想以RAII方式锁定std::mutex
时,我们使用std::lock_guard
。但是std::lock_guard
不能安全地锁定多个std::mutex
'e。
是否有任何方法可以利用这两种方法的优点,以RAII方式锁定多个std::mutex
'es ?
是的,您可以使用std::unique_lock
和std::defer_lock
。它告诉unique_lock不要立即锁定互斥锁,而是构建RAII包装器。
std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
std::lock(lk1, lk2);
由于std::lock
的可变特性,它不绑定到只有两个参数,而是可以使用编译器支持的任意多的参数。
Howard Hinnant还指出了一个关于性能的有趣事实,如果你感兴趣的话可以查看这个链接。他解决了性能问题,并表明std::lock
可以有效地实现,我也可以推荐阅读该帖子中的所有评论。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?