0

私は共有メモリ、x ライター、y リーダー、1 つの親プロセスを持っています。ライターには排他的なアクセス権があるため、1 人のライターが書き込みを行うことができ、他のリーダーとライターは待機する必要があります。複数のリーダーが並行して読み取ることができます。優先順位はライターにあるため、たとえば、3 つのリーダーが読み取りを行っていて、1 つのライターがその共有メモリに書き込みたい場合、それら 3 つのリーダーがジョブを終了すると、それ以上リーダーは読み取ることができず、ライターは書き込むことができなくなります。リーダーは並列に読み取ることができるため、セマフォを介して実装する方法がわかりません。次のコードは機能しません。すべてのリーダーがそのセマフォで待機するためです。

//reader
if(isWriterActive())
{
   sem_wait(semReaderStop);
} 

//writer
sem_wait(semReaderStop());
.
.
sem_post(semReaderStop());

ブロッキングではないので、このようなものは良くないと思います。

//readers doJob
if(isWriterActive())
{
    return E_WRITER_ACTIVE;
}

while(doJob()==E_WRITER_ACTIVE);
4

2 に答える 2

1

Pthreads リーダー/ライター ロックが必要です。ここには、Linux NPTL でのライター スターベーションに関する背景があります。

于 2012-04-30T14:23:33.937 に答える
0

あなたの問題は、古典的なプロデューサー/コンシューマーの問題のバリエーションです(読み取り/書き込み操作の同期制約はありません)。次の疑似コードにより、問題を解決する必要があります。

// globals
semaphore writers = 1; // "binary semaphore"
semaphore readers = 1; // "counting semaphore"

void writer() {
    sem_wait(writers); // wait until there's no writers
    sem_wait(readers); // wait until there's no readers

    // safe write context: no-one else can read nor write

    sem_post(readers); // signal other readers can run
    sem_post(writers); // signal other writers can run
}

void reader() {
    sem_wait(writers); // wait until there's no writers
    sem_post(readers); // there's one more reader active

    // safe read context: others can read, but no-one else can write

    sem_wait(readers); // this reader is completed
    sem_post(writers); // signal other writers can run
}

Synchronization の詳細については、この講義を参照してください。ただし、ダイクストラ セマフォについてオンラインで読むか、Tanenbaum のModern Operating Systemsのような優れた本を使用することをお勧めします。

于 2012-04-30T15:13:01.117 に答える