注意:这个问题涉及C ++ 11。 C ++ 17(或更高版本)中相同问题的答案可能已经改变。有关详细信息:
当我们要锁定多个std::mutex
时,我们会使用std::lock()
。但是std::lock()
不提供RAII功能。
如果我们想以RAII方式锁定std::mutex
,我们会使用std::lock_guard
。但std::lock_guard
无法安全锁定多个std::mutex
。
有没有办法利用这两种方法的优势,以RAII方式锁定多个std::mutex
?
答案 0 :(得分:67)
是的,您可以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
不仅仅绑定了两个参数,而是可以与编译器支持的参数一起使用。
std::lock
可以有效实施,我也建议阅读该帖子中的所有评论。