注意:这个问题涉及C++ 11.C++ 17(或更高版本)中相同问题的答案可能已经改变.详情如下:
当我们想要锁定多个时std::mutex
,我们使用std::lock()
.但std::lock()
不提供RAII功能.
当我们想以std::mutex
RAII方式锁定时,我们使用std::lock_guard
.但std::lock_guard
不能std::mutex
安全地锁定多个's.
有没有办法利用这两种方法的优势,以std::mutex
RAII的方式锁定多个?
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
可以高效实施的性能问题和展示,我还建议阅读该帖子中的所有评论.