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

问题描述 投票:0回答:1
  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,有可能出现死锁吗?
c++ multithreading c++11 locking mutex
1个回答
9
投票
  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
      之上实现,并且实现通常优先考虑读者,因为它要求支持递归读锁。
    • Boost
      shared_mutex
      力求公平,不偏袒任何一方。
  5. 对于读者优先

    shared_mutex
    ,如果始终至少有一个读者持有锁,那么您的编写器线程可能永远不会获取锁。

© www.soinside.com 2019 - 2024. All rights reserved.