shared_lock
和shared_mutex.lock_shared()
除了shared_lock
的析构函数解锁关联的互斥锁外,还有什么区别?<shared_mutex
是我可以与shared_lock
一起使用的唯一互斥锁类吗?- 为什么有人要使用
lock_guard
而不是unique_lock
? - 如果我有许多线程不断地锁定以读取 (
shared_lock
) 一个变量,并且我有一个变量试图锁定它以进行写入 (unique_lock
),这会写入吗线程优先于其他线程? - 对于 #4,是否有可能出现死锁?
最佳答案
shared_mutex.lock_shared()
是在共享模式下锁定shared_mutex
的函数调用,而shared_lock
是一个“锁-class”,用于锁定和自动解锁作用域末尾的互斥量。不,您可以将
shared_lock
与满足 SharedMutex 的任何类型一起使用要求。除非您需要
unique_lock
的附加功能,否则请始终使用lock_guard
。这样你的意图就更清楚了。这不取决于
shared_lock
或unique_lock
,而是取决于您使用的是什么SharedMutex
。标准未指定确切的行为。但这里有一些线索:- 在 Windows 上,
shared_lock
通常使用SRWLOCK
来实现,并尽量做到公平,例如将尝试平衡读者和作者。没有人会在这里有更高的优先级。 - 在 POSIX 系统上,
shared_mutex
很可能在pthread_rwlock_t
之上实现,并且实现通常优先考虑读取器,因为它需要支持递归读取锁。 - Boost
shared_mutex
试图做到公平,不偏袒任何一方。
- 在 Windows 上,
使用优先读取器
shared_mutex
如果始终至少有一个读取器持有它,则您的编写器线程可能永远不会获取锁。
关于c++ - 何时使用 C++11 mutex、lock、unique_lock、shared_lock 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770500/