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

The*_*ver 8 c++ multithreading mutex locking c++11

  1. 是什么区别shared_lock和shared_mutex.lock_shared()其他比的析构函数shared_lock解锁相关的互斥?
  2. 是shared_mutex我唯一可以使用的互斥类shared_lock吗?
  3. 为什么有人想用lock_guard而不是unique_lock?
  4. 如果我有很多线程不断锁定read(shared_lock)一个变量,并且我有一个变量试图将其锁定为write(unique_lock),那么这个写入线程是否优先于其他线程?
  5. 对于#4,是否有可能出现死锁?

Sta*_*irl 6

  1. shared_mutex.lock_shared()是一个shared_mutex在共享模式下锁定的函数调用,而shared_lock是一个“锁定类”,用于在范围结束时锁定和自动解锁互斥锁。

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

  3. 始终使用lock_guard,除非你需要额外的功能unique_lock。这样你的意图就更清楚了。

  4. 这不取决于shared_lock或unique_lock,而是取决于SharedMutex您使用的是什么。标准没有规定确切的行为。但这里有一些线索:

    • 在 Windows 上shared_lock通常会使用SRWLOCK并尝试公平,例如将尝试平衡读者和作者。没有人会拥有更高的优先级。
    • 在 POSIX 系统上,shared_mutex最有可能在上面实现,pthread_rwlock_t并且实现通常会优先考虑读取器,因为它需要支持递归读取锁。
    • Boostshared_mutex力求公平,不偏袒任何一方。
  5. 使用 reader-preferring 时shared_mutex,如果总是至少有一个 reader 持有它,则您的 writer 线程可能永远不会获取锁。