Sag*_*Low 5 c++ readwritelock c++11
我知道可以boost::UpgradeLockable
在 C++14 中使用。
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;
};
Run Code Online (Sandbox Code Playgroud)
对于定时和尝试变体也类似。请注意,连续访问两个互斥锁的定时变体必须做一些额外的工作,以避免花费最多 2 倍的请求时间,并且try_lock
必须小心第一个锁的状态,以防第二个锁失败。
然后你必须编写upgradable_lock
,并能够根据std::unique_lock
请求生成 a 。
当然,这是手写的线程安全代码,因此不太可能是正确的。
在 C++1z 中,您也可以编写不定时的版本(使用std::shared_mutex
和std::mutex
)。
更具体地说,一次只能有一个可升级锁或写锁。这就是unshared
互斥锁所代表的意义。
只要您持有unshared
,就没有其他人写入受保护的数据,因此您可以在不持有共享互斥体的情况下读取数据。
当您想要升级时,您可以获取共享互斥锁上的唯一锁。只要没有读者尝试升级到可升级,就不会陷入僵局。这会阻止读者读取,您可以写入,然后释放它并返回到只读状态(您只持有非共享互斥锁)。
归档时间: |
|
查看次数: |
3570 次 |
最近记录: |