从this问题中,我了解到std::scoped_lock是“std::lock_guard的一个严格的高级版本”。
从this问题中,我了解到"std::lock_guard和std::unique_lock是相同的“,除了std::unique_lock有一些额外的特性(例如。( try_lock),以额外的开销为代价。
std::scoped_lock 与 std::unique_lock**?**相比如何?
一些相关的问题,我希望得到这个问题的答案。
std::unique_lock
std::scoped_lock的区别是什么情况应该使用std::scoped_lock而不是std::unique_lock
std::unique_lock而不是std::scoped_lock
std::unique_lock的一些附加特性
发布于 2019-10-18 06:08:01
这两个对象是为了不同的目的。scoped_lock用于简单的情况,即希望以无死锁的方式锁定一定数量的互斥对象。锁定单个互斥体只是锁定多个互斥锁的特例。物体是完全不动的,而且非常简单。
unique_lock提供了许多特性,其中很少有在同时锁定多个互斥时特别适用。
std::lock等效调用锁定这些互斥对象的任何地方都将以相同的顺序锁定它们,无论发生什么。如果其中一个互斥锁已经被锁定(因此应该采用锁),那么它就被锁定在std::lock之外,因此您无法保证它是按照全局一致的顺序锁定的。这忽略了在指定要采用哪些互斥变量以及将哪些互斥对象指定为所有权的lock.
std::lock的单个调用或等效的对所有感兴趣的互斥锁进行锁定时才有效。如果要移动这些scoped_lock的所有权,就很容易在代码中的某个点上有多个scoped_lock在同一个作用域中,而此时您可以一次锁定所有这些scoped_lock。这正是创建std::lock所要避免的那种死锁。请注意,std::lock (scoped_lock功能的基础)甚至没有尝试提供任何这些特性。
是否有scoped_lock的专门化,它只使用一种提供unique_lock行为的互斥类型?好的。但这将违反scoped_lock的宗旨,即为多个互斥锁提供一个死锁安全锁。它只是意外地淘汰了lock_guard,因为它在单个互斥体的情况下具有相同的接口。
此外,具有非常不同的接口和功能的模板专门化通常效果并不好。以vector<bool>为例。
https://stackoverflow.com/questions/58443465
复制相似问题