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

46 c++ multithreading c++11

注意:这个问题涉及C++ 11.C++ 17(或更高版本)中相同问题的答案可能已经改变.详情如下:


当我们想要锁定多个时std::mutex,我们使用std::lock().但std::lock()不提供RAII功能.

当我们想以std::mutexRAII方式锁定时,我们使用std::lock_guard.但std::lock_guard不能std::mutex安全地锁定多个's.

有没有办法利用这两种方法的优势,以std::mutexRAII的方式锁定多个?

inf*_*inf 73

是的,你可以使用一个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);
Run Code Online (Sandbox Code Playgroud)

由于其可变参数性质std::lock不仅限于两个参数,而是可以与编译器支持的参数一起使用.

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

  • +1和`std :: lock`不仅限于两个锁.它可以处理任何数字(最多可变参数模板的编译器限制). (12认同)
  • 有人担心`std :: lock`的效率.请参阅此答案:http://stackoverflow.com/a/14525010/576911以解决这些问题. (2认同)