3

最初のリーダー/ライターの問題が書き込みプロセスを枯渇させる理由を理解するのに苦労しています。つまり、コードはどのようにしてリーダープロセスに優先順位を付けますか? リーダー プロセスの 1 つが実行するときに、ライター プロセスがロックを取得できないようにする必要がありsignal(wrt)ますか? セマフォのリストが構成されているということですか (LIFO リスト内のリーダー プロセスの安定したストリームによってライターがどのように飢えているかがわかります)、リーダー プロセスに優先順位を与える方法ですか、それともここで何か基本的なことを誤解していますか?

semaphore wrt=1,mutex=1;
readcount=0;
writer()
{
    wait(wrt);
    //writing is done
    signal(wrt);
}

reader()
{
    wait(mutex);
    readcount++;
    if(readcount==1)
        wait(wrt);
    signal(mutex);
    ///Do the Reading
    ///(Critical Section Area)
    wait(mutex);
    readcount--;
    if(readcount==0)
       signal(wrt);
    signal(mutex);
}
4

1 に答える 1

3

常に 2 つ以上のリーダーをアクティブにしている場合signal(wrt)、リーダー ブロックの最後で が呼び出されることはありません。新しい読者は持っていないreadcount == 1ので、wrt を待つことはありませんが、readcount を増やします。これにより、終わりのない読み取り要求がライター スレッドを枯渇させます。リーダー カウントが 0 になると、wrt が解放され、ライターが最終的に機能するようになります。それまでは読者優先。

これは正確にはLIFOアプローチではなく、読者が優先される優先キューです。

于 2013-04-10T17:24:05.197 に答える