我有数据加上一个Lock = boost::shared_mutex
. 我正在锁定数据访问
读卡器锁 ReadLock = boost::shared_lock<Lock>
和 作家锁 WriteLock = boost::unique_lock<Lock>
。
显然,可能有很多读者一次读取数据,而只有一个人在写入。但这里有一个问题:
单个线程可能在同一个互斥锁上具有多个读锁,因为它正在调用本身锁定数据的函数(使用 a ReadLock
)。但是,正如我所发现的,这会导致互锁:
- 线程 1 读取锁定数据 (Lock1)
- 线程 2 使用写锁 (LockW) 等待
- 线程 1 生成另一个读锁 (Lock2),而 Lock1 仍然存在
现在我得到一个锁,因为Lock2
正在等待LockW
退出,LockW
正在等待Lock1
,并且Lock1
因为Lock2
.
我不知道是否可以更改设计,使每个线程只执行一个ReadLock
. 我相信拥有一个让Writers 挨饿的系统会解决我的问题。如何处理我的案件有通用的方法吗?