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

时间:2015-11-18 01:55:29

标签: c++ multithreading c++11 locking mutex

  1. 除了shared_lock的析构函数解锁相关的互斥锁之外,shared_mutex.lock_shared()shared_lock之间有什么区别?
  2. shared_mutex是唯一可以与shared_lock一起使用的互斥类吗?
  3. 为什么有人想使用lock_guard代替unique_lock
  4. 如果我有很多线程经常锁定读取(shared_lock)变量并且我有一个变量试图将其锁定以进行写入(unique_lock),那么这个写入线程是否优先于其他的?
  5. 对于#4,是否有可能出现死锁?

1 个答案:

答案 0 :(得分:3)

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

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

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

  4. 这不取决于shared_lockunique_lock,而是取决于您使用的SharedMutex。标准未指定确切的行为。但是这里有一些线索:

    • 在Windows shared_lock上通常会使用SRWLOCK来实现,并尝试做到公平,例如将尝试平衡读者和作家。没有人在这里有更高的优先级。
    • 在POSIX系统上,shared_mutex最有可能在pthread_rwlock_t之上实现,并且由于需要支持递归读取锁,因此实现通常会优先考虑读者。
    • 助推shared_mutex试图做到公平,并且不偏向任何一方。
  5. 使用优先选择shared_mutex的读者,如果总是有至少一个读者持有该锁,那么您的作家线程可能永远不会获得该锁。