何时使用C++11互斥、锁、unique_lock、shared_lock等

When to use C++11 mutex, lock, unique_lock, shared_lock, etc

本文关键字:lock shared unique C++11 互斥 何时使      更新时间:2023-10-16
  1. 除了shared_lock的析构函数解锁相关互斥之外,shared_lockshared_mutex.lock_shared()之间有什么区别
  2. shared_mutex是我唯一可以与shared_lock一起使用的互斥类吗
  3. 为什么有人想要使用lock_guard而不是unique_lock
  4. 如果我有很多线程不断地锁定以读取(shared_lock)一个变量,而我有一个变量试图锁定它以进行写入(unique_lock),那么这个写入线程会比其他线程有优先权吗
  5. 对于#4,是否存在死锁的可能性
  1. shared_mutex.lock_shared()是一个在共享模式下锁定shared_mutex的函数调用,而shared_lock是一个"锁类",用于在作用域结束时锁定和自动解锁互斥对象。

  2. 不可以,您可以将shared_lock与满足SharedMutex要求的任何类型一起使用。

  3. 除非您需要unique_lock的附加功能,否则请始终使用lock_guard。这样你的意图就更明确了。

  4. 这并不取决于shared_lockunique_lock,而是取决于您使用的SharedMutex。标准中没有指定确切的庞然大物。但这里有一些线索:

    • 在Windows上,shared_lock通常使用SRWLOCK来实现,并尽量做到公平,例如,将努力平衡读者和作者。在这里没有人会有更高的优先级
    • 在POSIX系统上,shared_mutex很可能是在pthread_rwlock_t之上实现的,并且由于其需要支持递归读取锁,因此实现通常优先考虑读取器
    • Boost shared_mutex力求公平,不偏袒任何一方
  5. 由于阅读器偏好shared_mutex,如果总是有至少一个阅读器持有锁,那么您的编写器线程可能永远不会获得锁