std :: lock_guard或std :: scoped_lock?

C ++ 17引入了一个名为std::scoped_lock的新的锁类。

从文档看,它看起来类似于已经存在的std::lock_guard类。

有什么区别,我应该什么时候使用它?

scoped_locklock_guard的严格优越版本,它可以一次性locking任意数量的互斥锁(使用与std::lock相同的死锁避免algorithm)。 在新的代码中,你只能使用scoped_lock

lock_guard仍然存在的唯一原因是为了兼容性。 它不能被删除,因为它被用在当前代码中。 而且,改变它的定义(从一元到多元)是不可取的,因为这也是一个可观察到的,因此也是突破性的变化(但是有些技术上的原因)。

唯一的和重要的区别是, std::scoped_lock有一个可变参数的构造函数带有多个互斥体。 这允许在死锁中locking多个互斥体,就像使用了std::lock

 { // safely locked as if using std::lock std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2); } 

以前,你必须做一些小小的舞蹈,用std::lock以安全的方式locking多个互斥体。

范围locking的添加使得这更容易使用并避免了相关的错误。 你可以考虑std::lock_guard弃用。 std::scoped_lock的单个参数的情况可以作为专门化来实现,因此您不必担心可能的性能问题。

GCC 7已经支持std::scoped_lock ,可以在这里看到。

有关更多信息,您可能需要阅读标准纸张