c++ - 何时使用 C++11 mutex、lock、unique_lock、shared_lock 等

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

  1. shared_lockshared_mutex.lock_shared() 除了 shared_lock 的析构函数解锁关联的互斥锁外,还有什么区别?<
  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 是一个“锁-class”,用于锁定和自动解锁作用域末尾的互斥量。

  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 如果始终至少有一个读取器持有它,则您的编写器线程可能永远不会获取锁。

关于c++ - 何时使用 C++11 mutex、lock、unique_lock、shared_lock 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770500/

相关文章:

c++ - 我可以在一个类中将一个命名为lambda的函数作为变量,并尝试从主函数中调用该命名的lambda吗?

c++ - 每次启动我的应用程序时如何摆脱 UAC

c++ - 从 boost multi_index 数组中 move 元素

android - uiController.loopMainThreadForAtLeast 与 Thread.sleep 有何不同?

Java Hashmap 之类的数据结构,在获取时锁定键值对并在放回时解锁 - 为了爬虫的礼貌

android - startActivity应该在主线程上执行吗?

c++ - 识别标识符不工作的派生类

initialization - 如何使用统一初始值设定项 "reduce typing to create C++ types"?

具有模板和可见性的 c++ 继承

c++ - 在 lambda 函数中捕获 boost::asio::thread_pool