如何在读者作家解决方案中造成作家优先权失败?

时间:2012-06-28 02:45:40

标签: semaphore writers

我对读者/作者信号量解决方案失败感兴趣,写作者优先。

在以下代码中,取自维基百科:

    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 performed

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

...有一个二进制信号量mutex_3,它限制了尝试访问r信号量的线程数,以便编写者具有优先权。

我尝试删除那个互斥锁,期待作家挨饿,但没有成功。 我用Java编写了一个程序,其中线程等待两次固定的时间:在读/写之后和期间。我创建了一个编写器进程和8个读取器进程,并将等待数量设置为1毫秒。我尝试创造一种情况,其中r信号量不断遭到一位作家和许多读者的攻击。这些都没有导致我的预期失败。

我做错了吗?我怎么能导致作家饥饿?

1 个答案:

答案 0 :(得分:1)

在这个问题中 - 来自wikipedia -

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 performed

  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);

实际上很难让读者饿死,但从理论上讲,他们可能会这样做。

问题是作家优先于读者,所以如果你一直有作家,读者将永远等待执行。

希望它有所帮助!