我知道在C++ 14中可以使用boost::UpgradeLockable
。
C++ 11有没有类似的东西?升级读锁而不释放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;
};
和类似的定时和尝试变体。请注意,访问连续两个互斥锁的定时变量必须做一些额外的工作以避免花费高达所需时间的两倍,并且try_lock
必须小心第一个锁的状态,以防第二个失败。
然后,你必须写upgradable_lock
,有能力根据请求产生std::unique_lock
。
当然,这是手写的线程安全代码,所以它不太可能是正确的。
在C++ 1z中,您也可以编写一个不带时间的版本(使用std::shared_mutex
和std::mutex
)。
更具体地说,一次只能有一个可升级或写入锁定。这就是unshared
互斥体所代表的。
只要你持有unshared
,没有其他人正在写入保护数据,所以你可以从中读取数据而不必保留共享互斥。
当您想升级时,您可以在共享互斥锁上获取唯一的锁。只要没有读者尝试升级到可升级,这不会发生死锁。这可以避免读者阅读,可以编写,然后释放它并返回到只读状态(只保存非共享的互斥体)。
这个解决方案是否需要在升级之前寻找一个名为'shared'的互斥锁的unique_lock之前先删除shared_lock?在这种情况下,第二个互斥“非共享”将会是多余的,或者我错过了什么? –
@RichardHodges可升级锁根本不拥有共享锁。它只在非共享互斥量上拥有unique_lock。然后它在升级时直接在共享互斥量上获得unique_lock。这一点就是你在升级时不会失去读锁。 – Yakk
明白了,谢谢。 –
- 1. C#中的可升级读锁与写锁的区别ReaderWriteLock
- 2. pthreads:读写器锁,将读锁升级到写锁
- 3. C++ Boost ::线程可升级互斥锁“尝试升级锁定”?
- 4. ReaderWriterLockSlim:一个可升级的锁之后获取读锁不会抛出LockRecursionException
- 5. SVN锁不释放
- 6. 可升级的读/写锁Win32
- 7. Swift pthread读/写锁需要一段时间才能释放锁
- 8. ROWLOCK和锁升级
- 9. 锁定文件并删除它,而不先释放锁
- 10. 升级Java的读锁写锁缓存在地图
- 11. 并发:Condition.awaitNanos()不释放锁
- 12. Java - Thread.join()不释放锁
- 13. 锁不会被释放
- 14. 释放互斥锁。
- 15. IDirect3DDevice9释放死锁
- 16. 重入锁释放
- 17. 释放BufferedReader.readLine(),而用synchronized方法锁定
- 18. 优化程序将行级锁升级到宏级中的表级锁
- 19. C++ 11线程的RW锁
- 20. 确保释放锁的宏
- 21. 在C++中锁定析构函数中的互斥锁11
- 22. 使用“扔”而不释放互斥锁在win32中安全吗?
- 23. 如何释放唤醒锁?
- 24. flock(1)未能释放锁
- 25. H2数据库释放锁
- 26. 锁,工艺和释放JDBC
- 27. StackExchange.Redis LockTake及锁定释放
- 28. 需要释放互斥锁?
- 29. mysql - 行锁定和释放
- 30. 等待锁定被释放
不幸的是,直到c + + 17:http://en.cppreference.com/w/cpp/thread/shared_mutex –
@RichardHodges我不明白这个链接是如何相关的。在那个界面中,哪些地方允许锁升级? – Yakk
@Yakk嗯,你是对的。这就引出了问题,标准建议是否缺少了某些东西,或者是一个可升级的锁简单地不必要? –