什么是locking多个std :: mutex'es的最好方法?
当我们想要locking多个std::mutex
,我们使用std::lock()
。 但是std::lock()
不提供RAIIfunction。
当我们想用RAII方式locking一个std::mutex
时,我们使用std::lock_guard
。 但std::lock_guard
无法安全地locking多个std::mutex
。
有没有办法利用这两种方法的优点,以RAII方式locking多个std::mutex
?
是的,你可以使用std::unique_lock
和std::defer_lock
。 它告诉unique_lock不立即locking互斥锁,而是构buildRAII封装。
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
可以有效地实现,我也可以推荐阅读该文章中的所有评论。
- 如果copy-list-initialization允许显式的构造函数,会出现什么问题?
- 为什么我们可以在`const`对象上使用`std :: move`?
- g ++和clang ++与积分模板参数的不同行为
- C ++ 11:variables模板函数参数的数量?
- 为什么std :: ostream和char之间的operator <<函数是非成员函数?
- C ++ 11初始化程序列表失败 – 但仅限于长度为2的列表
- 三规则与C ++ 11成为五大规则?
- C ++ 11 std :: set lambda比较函数
- 使用C ++ 11期货:std ::asynchronous崩溃的嵌套调用:编译器/标准库的错误?