gpt4 book ai didi

c++ - boost::unique_lock 和 boost::shared_lock 用于读写锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:56 25 4
gpt4 key购买 nike

我们已经实现了读写锁

 typedef boost::unique_lock<boost::shared_mutex> WriterLock;
typedef boost::shared_lock<boost::shared_mutex> ReadersLock;

我们有很多多线程读者而只有少数作家。读者与其他读者共享访问权限,但阻止作者访问。Writer 阻塞,直到它具有对该资源的独占访问权限。

我们无法在 boost 文档中找到它...防止Writer饥饿的策略是什么?
例如,如果有很多读者都从一个线程池中获取锁,那么在写者最终获得锁之前,锁尝试次数是否有上限?

我们看到的性能数字似乎表明写入必须等到根本没有读者,并且在极少数情况下会等待很长时间,因为新读者可以在当前读者正在接受服务时请求锁定。在那种情况下,在我们的代码中,编写者似乎必须等待很长时间,直到根本没有读取。

我们更喜欢一个更像队列的系统,当一个写者请求一个锁时,所有当前的读者都会流失,但所有新进入的读者都会阻塞在写者请求之后。

Boost 中可升级锁概念的行为是什么? Boost threads

它并没有说明它是如何处理作家饥饿的。

最佳答案

@Guerrero 解决方案的一个小改进,增加了多个读者和多个作者的公平性,因此没有人会饿死:

read() {
while (atomic-write-requests > 0)
condition.wait();
ReadersLock lock(acquireReaderLock());
doRead();
}
write() {
while (atomic-write-requests > 0)
condition.wait();
atomic-write-requests++;
WritersLock lock(acquireWriterLock());

doWrite();
atomic-write-requests--;
condition.notify();
}

在此解决方案中,每当作者离开范围时,都会开始新的公平竞争。

关于c++ - boost::unique_lock 和 boost::shared_lock 用于读写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13076202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com