C++ 17引入了一个名为std::scoped_lock
的新锁类。std :: lock_guard或std :: scoped_lock?
从文档判断,它看起来类似于已有的std::lock_guard
类。
有什么区别,我应该什么时候使用它?
C++ 17引入了一个名为std::scoped_lock
的新锁类。std :: lock_guard或std :: scoped_lock?
从文档判断,它看起来类似于已有的std::lock_guard
类。
有什么区别,我应该什么时候使用它?
单一和重要的区别是std::scoped_lock
有一个可变参数构造函数,它带有多个互斥量。这允许以死锁的方式锁定多个互斥体,就好像使用了std::lock
一样。
{
// safely locked as if using std::lock
std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);
}
以前,你必须做一个小舞在使用std::lock
一种安全的方式来锁定多个互斥的解释this answer。
范围锁定的添加使其更易于使用并避免相关错误。您可以考虑使用std::lock_guard
。 std::scoped_lock
的单个参数案例可以作为专业化实施,因此您不必担心可能的性能问题。
GCC 7已经支持std::scoped_lock
可以看到here。
欲了解更多信息,您可能需要阅读的standard paper
的scoped_lock
是lock_guard
严格优越的版本锁定互斥的一次性任意数量(使用相同的死锁避免算法为std::lock
)。在新代码中,您只能使用scoped_lock
。
lock_guard
仍然存在的唯一原因是为了兼容性。它不能被删除,因为它用在当前代码中。此外,事实证明,改变其定义(从一元到多元)是不可取的,因为这也是一种可观察的,因此也是突破性的变化(但有些技术上的原因)。
此外,感谢类模板参数推导,您甚至不必列出可锁定类型。 –
@NicolBolas:确实如此,但这也适用于'lock_guard'。但它确实使守护类更容易使用。 –
仅10分钟后回答了您自己的问题。你真的不知道吗? – Walter
@Walter我做了https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/ – inf
@Ruslan不确定你的意思。没有10分钟的延迟。当你创建一个问题时,你已经可以提供答案。 – inf