55

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


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

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

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

4

1 回答 1

91

是的,您可以使用std::unique_lockwith 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 还指出了一个关于性能的有趣事实,如果您有兴趣,可以查看链接。他解决了性能问题并展示了std::lock可以有效实施的内容,我还建议阅读该帖子中的所有评论。

于 2013-06-14T17:00:45.580 回答