2012-04-02 13 views
5

リーダライタ問題に対する2番目のアルゴリズムを理解するのは本当に苦労しています。私は一般的な概念を理解しています。作家は読者よりも優先されます(読者は飢えている可能性があります)。私はこのアルゴリズムReader/Writer Locks in C++の条件変数の実装を理解しています。しかし、セマフォー& mutexの実装は私には意味がありません。これはウィキペディアからの例です:リーダライタへの2番目のアルゴリズム解決策

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 done 

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

[http://en.wikipedia.org/wiki/Readers-writers_problem][2] 

私は3つのセマフォ(ミューテックス3、R、およびミューテックス1)リーダーロックにするためのものであるかを理解していません。 readcountには1つのセマフォーで十分ではありませんか?

+0

アルゴリズムやWikipediaのページへのリンクを投稿して、同じことをすべて確認してください。 – gbulmer

答えて

8

mutex 1は、変数readcountを保護します。 mutext 2writecount変数を保護します。 mutex rは、読み取り操作とmutextを保護します。wは、書き込み操作を保護します。

1)の作家が入って来たとしましょう:

信号mutex 2インクリメントwritercountそれがmutex 2を保持していると)(writercountを変更することができる唯一の方法であるので、余分な作家(自体) を考慮して、 (writercount==1)が本当であれば、mutex rが他のライター(writercount > 1)が入って来るのを防ぐために信号を送ることができますか?これは、すでに唯一のライターかどうかを安全にテストできます。rが既に通知されています。

ライターはmutex wに他の(同時の)ライターからの変更を保護するように通知します。

最後の作者(writecount==1)は、読者がタスクを実行できるようにmutex rをリリースしました。

2)のは、読者が入って来たとしましょう:

信号mutex 3他の読者から読者のセットアップロジックを保護するために、 mutex rをシグナルして、他のライターから保護します(ライターが動作している間にrが通知されます)。 readcount(終了している可能性のある他のリーダから)を保護するための信号mutex 1と、それが最初のリーダ(readercount == 1)の場合、ライタから保護するためにmutex wに信号を送ります。

読み取りが

(ライターからそう何intereference、ミューテックスwこの時点で保持されて、覚えていない)を読み出しつつ何ら保護が他の読者から必要とされない、並列に行うことができ、最後のリーダーは、書き込みミューテックスをリセット(w)を使用してライターを許可します。


ライターの飢餓を防ぐトリックは(ミューテックスpを知らせるとき)の作家が読者としてのポーズということですので、多くの読者が存在する場合であっても、スケジュール取得のチャンスを持っています。また、mutex 3は、mutex rで待機する読者の数が多すぎるのを防ぎます。そのため、ライターは、rが来ると信号を送る機会があります。

+0

アッティラの説明をありがとう。書き込み部分は理にかなっていますが、読み出し部分はまだ私には不明です。おそらくこれを理解するために、mutex 3とmutex 1セマフォがない場合(何故ならば、セマフォーはリードカウントを保護するために残っているだけです)、何が起こるのかを説明できるでしょうか? – ayl

+3

Readcountは 'mutex 1 'によって保護されています。 'mutex 3 'は、' r'を待つ並列リーダの数を1に制限するために使用されます(ライタの飢餓を防ぐため)。 'r'は読者と作家の間のアクセスを調整するために使用されます – Attila

+1

mutex 3はもっともトリッキーな部分です。しかし、よく説明される! – Garfield