何时使用C++11互斥、锁、unique_lock、shared_lock等
When to use C++11 mutex, lock, unique_lock, shared_lock, etc
- 除了
shared_lock
的析构函数解锁相关互斥之外,shared_lock
和shared_mutex.lock_shared()
之间有什么区别 shared_mutex
是我唯一可以与shared_lock
一起使用的互斥类吗- 为什么有人想要使用
lock_guard
而不是unique_lock
- 如果我有很多线程不断地锁定以读取(
shared_lock
)一个变量,而我有一个变量试图锁定它以进行写入(unique_lock
),那么这个写入线程会比其他线程有优先权吗 - 对于#4,是否存在死锁的可能性
-
shared_mutex.lock_shared()
是一个在共享模式下锁定shared_mutex
的函数调用,而shared_lock
是一个"锁类",用于在作用域结束时锁定和自动解锁互斥对象。 -
不可以,您可以将
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
,如果总是有至少一个阅读器持有锁,那么您的编写器线程可能永远不会获得锁
相关文章:
- 尝试构建"lock-free"数据结构C++
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 引用 std::shared:ptr 以避免引用计数
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- "lock cmpxchg"如何在装配中工作?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 无法使用 libtool 将 -shared 参数传递给 g++
- std::lock 仍然导致死锁
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 使用Mutex,lock_guard,在课堂中正确地lock
- gcc -fPIC vs. -shared
- 在shared_from_this()中的错误类型(在继承类中)(是否有dyn.type-ware shared Poi
- 当我调用lock()时,为什么std :: mutex会引发异常