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

...バイナリセマフォがあり、セマフォmutex_3にアクセスしようとするスレッドの数を制限しrて、ライターが優先されるようにします。

ライターが飢えることを期待して、そのミューテックスを削除しようとしましたが、成功しませんでした。私は Java でプログラムを作成しました。このプログラムでは、スレッドは一定時間 2 回待機します。読み取り/書き込み後と書き込み中です。1 つの書き込みプロセスと 8 つの読み取りプロセスを作成し、待機量をすべて 1 ミリ秒に設定しました。rセマフォが常に 1 人のライターと多数のリーダーによって攻撃されている状況を作成してみました。これのどれも、私が期待した失敗を引き起こしませんでした。

私は何か間違ったことをしていますか?ライターの飢餓を引き起こすにはどうすればよいですか?

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

リーダーを飢えさせることは実際には難しいでしょうが、理論的には可能です。

問題は、ライターがリーダーよりも優先されるということです。したがって、ライターが常に来ている場合、リーダーは永遠に実行を待機することになります。

それが役に立てば幸い!

于 2012-09-03T18:18:38.960 に答える