2017-03-25 110 views

回答

20

单一和重要的区别是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_guardstd::scoped_lock的单个参数案例可以作为专业化实施,因此您不必担心可能的性能问题。

GCC 7已经支持std::scoped_lock可以看到here

欲了解更多信息,您可能需要阅读的standard paper

+2

仅10分钟后回答了您自己的问题。你真的不知道吗? – Walter

+5

@Walter我做了https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/ – inf

+0

@Ruslan不确定你的意思。没有10分钟的延迟。当你创建一个问题时,你已经可以提供答案。 – inf

34

scoped_locklock_guard严格优越的版本锁定互斥的一次性任意数量(使用相同的死锁避免算法为std::lock)。在新代码中,您只能使用scoped_lock

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

+4

此外,感谢类模板参数推导,您甚至不必列出可锁定类型。 –

+2

@NicolBolas:确实如此,但这也适用于'lock_guard'。但它确实使守护类更容易使用。 –

相关问题