什么是locking多个std :: mutex'es的最好方法?

当我们想要locking多个std::mutex ,我们使用std::lock() 。 但是std::lock()不提供RAIIfunction。

当我们想用RAII方式locking一个std::mutex时,我们使用std::lock_guard 。 但std::lock_guard无法安全地locking多个std::mutex

有没有办法利用这两种方法的优点,以RAII方式locking多个std::mutex

是的,你可以使用std::unique_lockstd::defer_lock 。 它告诉unique_lock不立即locking互斥锁,而是构buildRAII封装。

 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可以有效地实现,我也可以推荐阅读该文章中的所有评论。