【问题标题】:Second Algorithm Solution to Readers-Writer读写器的第二种算法解决方案
【发布时间】:2012-04-02 10:02:28
【问题描述】:

我很难理解读者-作者问题的第二种算法。我理解一般概念,即作者将优先于读者(读者可能会挨饿)。我什至了解Reader/Writer Locks in C++这个算法的条件变量实现。但是,信号量和互斥量的实现对我来说毫无意义。这是维基百科的一个例子:

int readcount, writecount; (initial value = 0)
semaphore mutex 1, mutex 2, mutex 3, w, r ; (initial value = 1)

READER
  P(mutex 3);
    P(r);
      P(mutex 1);
        readcount := readcount + 1;
        if readcount = 1 then P(w);
      V(mutex 1);
    V(r);
  V(mutex 3);

  reading is done

  P(mutex 1);
    readcount := readcount - 1;
    if readcount = 0 then V(w);
  V(mutex 1);


WRITER
    P(mutex 2);
      writecount := writecount + 1;
      if writecount = 1 then P(r);
    V(mutex 2);

  P(w);
    writing is performed
  V(w);

  P(mutex 2);
    writecount := writecount - 1;
    if writecount = 0 then V(r);
  V(mutex 2);

[http://en.wikipedia.org/wiki/Readers-writers_problem][2]

我不明白读者锁中的三个信号量(互斥量 3、r 和互斥量 1)的用途。一个信号量还不够读取计数吗?

【问题讨论】:

  • 能否请您发布一个指向算法或维基百科页面的链接,以确保我们都在看同一个东西?

标签: algorithm concurrency synchronization


【解决方案1】:

mutex 1 保护readcount 变量; mutext 2 保护writecount 变量; mutex r 保护读操作, mutext w 保护写操作。

1) 假设一个作家进来了:

信号 mutex 2 并递增 writercount 以说明额外的写入器(本身) 因为它是唯一可以改变writercount的进程(因为它持有mutex 2),所以它可以安全地测试它是否是唯一的写者(writercount==1),如果为真,它会发出互斥锁r来保护读者从进来 - 其他作家 (writercount > 1) 可以享受互斥锁 r 已经发出信号。

然后写入器向 mutex w 发出信号,以保护其更改不受其他(并发)写入器的影响。

Last writer (writecount==1) 发布 mutex r 让读者执行他们的任务。

2) 假设有读者进来:

信号mutex 3 以保护阅读器的设置逻辑不受其他阅读器的影响;然后向 mutex r 发出信号以防止其他写入者(请记住,r 在写入者操作时发出信号);然后向mutex 1 发送信号以保护readcount(来自其他可能正在退出的读取器),如果它是第一个读取器(readercount == 1),则向mutex w 发送信号以保护写入器(现在排除写入器执行其操作)。

读取可以并行进行,因此在读取时不需要保护其他读取器(请记住,此时互斥锁 w 被持有,因此写入器不会相互引用)

然后最后一个读取器重置写入互斥锁 (w) 以允许写入器。


防止写入器饥饿的技巧是写入器伪装成读取器(在发送互斥锁p 时),因此即使有很多读取器也很有可能被调度。此外,mutex 3 可以防止太多读者等待互斥体 r,因此作者有很好的机会在 r 到来时发出信号。

【讨论】:

  • 感谢阿提拉的解释。写入部分非常有意义,但读取部分对我来说仍然不清楚。也许为了更好地理解这一点,您可以解释如果没有互斥量 3 和互斥量 1 信号量会发生什么(仅保留 r 信号量来保护读取计数)?
  • 读取计数受mutex 1 保护。 mutex 3 用于将等待r 的并发读者数限制为1(以防止写者饥饿)。 r 用于协调读写器之间的访问
【解决方案2】:

查看Concurrent Control with "Readers" and "Writers" by P.J. Courtois, F. Heymans, and D.L. Parnas,这是维基百科代码的参考。它解释了为什么需要所有互斥锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多