std :: lock_guard或std :: scoped_lock?
C ++ 17引入了一个名为std::scoped_lock
的新的锁类。
从文档看,它看起来类似于已经存在的std::lock_guard
类。
有什么区别,我应该什么时候使用它?
scoped_lock
是lock_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
,可以在这里看到。
有关更多信息,您可能需要阅读标准纸张