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

What's the best way to lock multiple std::mutex'es?

本文关键字:最佳 方法 是什么 mutex std 锁定      更新时间:2023-10-16

注意:这个问题涉及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_lockstd::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可以有效地实现,我也可以推荐阅读该帖子中的所有评论。