在不释放 C++11 中的第一个的情况下将读锁升级为写锁?

Upgrading read lock to write lock without releasing the first in C++11?

我知道可以在 C++14 中使用 boost::UpgradeLockable
C++11 有类似的东西吗?

可以在更简单的锁定原语之上编写可升级锁。

struct upgradeable_timed_mutex {
  void lock() {
    upgradable_lock();
    upgrade_lock();
  }
  void unlock() {
    upgrade_unlock();
    upgradable_unlock();
  }
  void shared_lock() { shared.shared_lock(); }
  void shared_unlock() { shared.shared_unlock(); }

  void upgradable_lock() { unshared.lock(); }
  void ungradable_unlock() { unshared.unlock(); }

  void upgrade_lock() { shared.lock(); }
  void upgrade_unlock() { shared.unlock(); }
private:
  friend struct upgradable_lock;
  std::shared_timed_mutex shared;
  std::timed_mutex unshared;
};

与定时和尝试变体类似。请注意,连续访问两个互斥锁的定时变体必须做一些额外的工作以避免花费最多 2 倍的请求时间,并且 try_lock 必须注意第一个锁的状态以防第二个锁失败。

然后你必须编写 upgradable_lock,能够根据要求生成 std::unique_lock

当然这是hand-written线程安全代码,所以不太可能是正确的。

在 C++1z 中,您也可以编写不计时的版本(使用 std::shared_mutexstd::mutex)。


不太具体,一次只能有一个可升级锁或写锁。这就是 unshared 互斥体所代表的。

只要您持有 unshared,就没有其他人在写入受保护的数据,因此您可以从中读取数据而无需持有共享互斥量。

当你想升级时,你可以在共​​享互斥锁上获取唯一锁。只要没有读者尝试升级到可升级,这就不会死锁。这将读者排除在读取之外,您可以写入,然后释放它并 return 回到只读状态(您只持有未共享的互斥锁)。