【问题标题】:boost::unique_lock and boost::shared_lock for reader writer locksboost::unique_lock 和 boost::shared_lock 用于读写器锁
【发布时间】:2012-10-25 19:54:47
【问题描述】:

我们已经实现了一个读写锁

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

我们有许多多线程阅读器,而编写器只有几个。 读取器与其他读取器共享访问权限,但阻止写入器。 Writer 阻塞,直到它拥有对资源的独占访问权。

我们在 boost 文档中找不到这个... 防止 Writer 饿死的政策是什么?
例如,如果有很多读者都从线程池中敲锁,那么在写者最终获得锁之前,是否有任何尝试锁定次数的保证上限?

我们看到的性能数据似乎表明写入必须等到完全没有读取器,并且在极少数情况下需要很长时间,因为新读取器可以在为当前读取器提供服务时请求锁定。在这种情况下,在我们的代码中,作者似乎必须等待很长时间,直到根本没有读取。

我们更喜欢类似队列的系统,当写入者请求锁定时,所有当前读取者都会耗尽,但所有新进入的读取者都会在写入者请求之后阻塞。

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

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

【问题讨论】:

  • stackoverflow.com/a/9385208/98654 声明 boost::shared_mutex 的“公平性”是特定于实现的,但没有该声明的来源。
  • 您是否试图让作者优先于读者?
  • PriorNycz - 不是所有线程都具有相同的优先级。读者很快,但可能有很多读者。只有少数作家。因此,如果作者被阻止,如果根本没有等待读者,可能需要很长时间。
  • 另一个有趣的话题。 stackoverflow.com/questions/989795/…

标签: c++ multithreading boost


【解决方案1】:

@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();
}

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

【讨论】:

    【解决方案2】:

    在不了解 boost 实现的情况下,也许您可​​以通过实现来防止 writer 饿死。当作家存在时,读者可以等待。也许像这样的伪代码:

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

    【讨论】:

    • 是的,我们正在考虑这样的方案。让它完全防水,没有比赛条件等会有点棘手。
    • 这对读者不公平。如果存在多个作家,那么他们可能会饿死读者。我已经针对这个问题发布了一个类似的解决方案,可以提高公平性。
    【解决方案3】:

    如果您想要的是一种先进先出方法,boost 在其状态图库上实现了几种调度策略(包括 FIFO)。我猜你将不得不调整你的很多代码来使用它。 查看有关 fifo_scheduler 和 FifoWorker 的文档:

    http://www.boost.org/doc/libs/1_51_0/libs/statechart/doc/reference.html#FifoWorker

    http://www.boost.org/doc/libs/1_51_0/libs/statechart/doc/reference.html#fifo_scheduler.hpp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多