lac*_*chy 22 c++ multithreading locking c++11 c++17
从这个问题我明白这std::scoped_lock是“一个严格的高级版本std::lock_guard”。
从这个问题我明白“std::lock_guard和std::unique_lock是一样的”,除了std::unique_lock有一些额外的功能(例如try_lock),但需要一些额外的开销。
与std::scoped_lock相比如何std::unique_lock?
我希望通过这个问题回答一些相关的问题。
std::scoped_lock和之间有什么区别std::unique_lock?std::scoped_lock而不是std::unique_lock?std::unique_lock而不是std::scoped_lock?std::scoped_lock实现 的一些附加功能std::unique_lock?Nic*_*las 21
这两个对象用于不同的目的。scoped_lock适用于想要以无死锁方式锁定一定数量的互斥对象的简单情况。锁定单个互斥锁只是锁定多个互斥锁的特例。物体完全不动,而且非常简单。
unique_lock提供了许多功能,其中很少有在同时锁定多个互斥锁时特别适用的功能。
延迟锁定。推迟要么全有要么全无;您要么推迟锁定所有互斥锁,要么不锁定。不清楚为什么要推迟锁定一系列互斥锁,因为如果其中任何一个失败,您将不得不放弃任何成功的锁。
超时锁定。如果您想要 100 毫秒的超时,这是否意味着锁定所有互斥锁的时间不应超过 100 毫秒?也就是说,如果第3个立即锁定,但下一个需要75ms,如果第5个需要30ms,是否应该认为超时?
采用互斥锁。在单个操作中锁定多个互斥锁的全部意义在于能够避免死锁。这是通过以全局一致的顺序锁定互斥锁来完成的。也就是说,任何你用std::lock等效调用锁定这些互斥对象的地方都会以相同的顺序锁定它们,无论如何。
如果其中一个互斥锁已被锁定(因此应采用该锁),则它被锁定在 之外std::lock,因此您无法保证它以全局一致的顺序被锁定。这忽略了指定采用哪些互斥锁和锁定哪些互斥锁的困难。
所有权转让(可移动)。出于与采用锁类似的原因,对于多个互斥体来说,这是一个可疑的前景。防止死锁的保证仅在对std::lock所有相关互斥锁的单个调用或等效锁定时才有效。如果您正在移动这些scoped_locks 的所有权,则很容易在代码scoped_lock中处于同一作用域中有多个s 的位置,而此时您可以一次性锁定所有这些 s。这std::lock正是为了避免而造成的僵局。
请注意,std::lock(scoped_lock的功能的基础)甚至没有尝试提供任何这些功能。
是否有一种专门化scoped_lock只采用一种互斥锁类型来提供 的行为unique_lock?当然。但这会违反 的目的scoped_lock,它是多个互斥锁的死锁安全储物柜。它只是lock_guard偶然被淘汰,因为它在单个互斥锁的情况下具有相同的接口。
此外,拥有具有截然不同接口和功能的模板专业化通常效果不佳。见vector<bool>,例如,
| 归档时间: |
|
| 查看次数: |
6156 次 |
| 最近记录: |