【问题标题】:When to use C++11 mutex, lock, unique_lock, shared_lock, etc何时使用 C++11 互斥锁、锁、unique_lock、shared_lock 等
【发布时间】:2015-11-18 01:55:28
【问题描述】:
  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,是否有可能出现死锁?

【问题讨论】:

  • 总是更喜欢 RAII 而不是显式发布操作。否则,请使用提供所需功能的最简单的功能,这样您就不必为不需要的功能付费。
  • RAII 是指用大括号括住我的锁定代码?例如:{锁;富 = ...; // 析构函数将解锁 }
  • 不是和是的。锁类满足 RAII 要求,即在调用锁的析构函数后锁定某些东西并自动解锁。使用互斥锁,您必须明确解锁它们。
  • C++ Concurrency In Action by Anthony Williams 将是一个好的开始。
  • 在互斥锁的页面上,这个例子现在使用了lock_guard

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


【解决方案1】:
  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,如果始终至少有一个读者持有锁,则您的编写器线程可能永远不会获取锁。

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 2014-07-16
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多