【发布时间】:2020-11-16 17:46:59
【问题描述】:
假设我有几个线程从共享内存中读取。所有这些线程都在重复获取共享互斥锁上的共享锁来访问此内存。
假设我有一个线程写入该共享内存并获取独占锁。
如果有足够多的读取线程,可能永远不会有一个时间点,一个写入线程能够获取排他锁,因为共享锁在任何时间点都由多个线程持续持有。
解决这个问题最简单最直接的模式是什么?我正在寻找一种简单直接的方法来解决这个问题,最好使用 STL。
C++ 中的示例实现也会很有帮助。
【问题讨论】:
-
这能回答你的问题吗? Reader/Writer Locks in C++
-
赋予写入者优先权的锁。一旦线程开始等待写锁,就不会再发出读锁了。释放所有读锁后,将授予写锁。
-
@MartinYork,stl 中有什么可以做到这一点吗?链接的帖子有一个 C++17 的实现,我相信它仍然会饿死写线程,我宁愿使用现有的预先测试的东西而不是实现我自己的读写锁。
-
@J... 不是真的。线程中有几个不正确的答案,它只关注使用什么样的互斥锁和锁。我已经在这里使用了共享锁,问题是线程饥饿,因为有许多读取线程和一个写入线程。具体来说,如果存在的话,我正在寻找一个简单直接的 stl 预构建解决方案。
-
令我惊讶的是,该标准没有定义任何方式来指定解决
std::shared_mutex冲突的“策略”,并且它不需要将新读者带入在等待的作家后面排队(即上面@MartinYork 描述的内容。)哦,好吧!这不是我第一次对 C++ 标准感到惊讶。
标签: c++ multithreading locking mutex