锁定多个std :: mutex'es的最佳方法是什么?

时间:2013-06-14 16:56:28

标签: c++ multithreading c++11

注意:这个问题涉及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

1 个答案:

答案 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不仅仅绑定了两个参数,而是可以与编译器支持的参数一起使用。

Howard Hinnant还指出了一个有关性能的有趣事实,如果您有兴趣,可以查看this链接。他解决了性能问题,并表明std::lock可以有效实施,我也建议阅读该帖子中的所有评论。