1

我有兴趣在读者/作者信号量解决方案中导致失败,作者优先。

在以下代码中,取自 Wikipedia:

    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信号量不断受到一位作家和许多读者的攻击。这些都没有导致我预期的失败。

难道我做错了什么?我怎样才能导致作家挨饿?

4

1 回答 1

1

在这个问题中 - 来自维基百科-

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

在实践中很难让读者饿死,但从理论上讲,他们可以。

问题是 Writers 优先于 Readers,所以如果你一直有 Writers 来,那么 Readers 将永远等待执行。

希望能帮助到你!

于 2012-09-03T18:18:38.960 回答