加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 用于读写器锁的boost :: unique_lock和boost :: shared_loc

发布时间:2020-12-16 07:01:52 所属栏目:百科 来源:网络整理
导读:我们已经实现了一个读写器锁 typedef boost::unique_lockboost::shared_mutex WriterLock; typedef boost::shared_lockboost::shared_mutex ReadersLock; 我们有很多多线程读者,只有少数作家. 读者与其他读者共享访问权限但阻止作者. Writer阻塞,直到它具有
我们已经实现了一个读写器锁

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

我们有很多多线程读者,只有少数作家.
读者与其他读者共享访问权限但阻止作者.
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();
}

在这个解决方案中,每当作家离开范围时,都会开始一场新的公平竞争.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读