将读锁定升级到写锁定而不释放C ++ 11中的第一个?

时间:2016-01-25 13:35:42

标签: c++ c++11 readwritelock

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

1 个答案:

答案 0 :(得分:1)

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

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;
};

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

然后你必须写upgradable_lock,能够根据请求产生std::unique_lock

当然这是手写的线程安全代码,因此不太可能是正确的。

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

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

只要您持有unshared,其他人就不会写入受保护的数据,因此您可以在不保留共享互斥锁的情况下从中读取数据。

如果要升级,可以在共享互斥锁上获取唯一锁定。只要没有读者尝试升级到可升级,这就不会死锁。这使读者无法阅读,您可以编写,然后将其释放并返回到只读状态(您只能保存非共享互斥锁)。