2012-04-30 17 views
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); 
+0

これは、リーダー/ライターロックの通常の説明です。 pthread_rwlock http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_rwlock_init.html – gastush

+0

自分でロックプリミティブを実装しようとしないでください。通常の読み取り/書き込みロックを使用します(ただし、作者が飢えていないように振る舞いを確認してください)。 – ugoren

+0

私はセマフォ(学校)を使う必要があります。 – Krab

答えて

1

あなたはPthreadsのリーダ/ライタロックを必要とする - のLinux NPTLのライター飢餓にいくつかの背景hereがあります。

+0

いいえ、私はセマフォだけを使用できます。 – Krab

+0

'rw_semaphore'を使用することはできませんか? http://tuxthink.blogspot.com/2011/05/reader-writer-semaphores-in-linux.html –

0

あなたの問題は、従来のプロデューサー/コンシューマーの問題(特定の読み取り/書き込み操作の同期制約なし)のバリエーションです。このlectureを参照してください同期の詳細については

// 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 
} 

が、私はオンラインまたはタネンバウムのModern Operating Systemsような良い本を使用してDijkstra Semaphoresについての詳細を読んでお勧めします:次の擬似コードは、あなたの問題を解決しなければならないことができます。

関連する問題