2012-03-08 5 views
1

私は以下の疑似ソリューションを割り当ての一部としてjavaに実装しようとしています。擬似は、読者の好みプログラム、特に読者のプロセス自体のためのものです。それに付随する作家のプロセスがありますが、私はそれを貼り付けることを気にしませんでした。読者と作家Javaソリューションのクエリ(条件付きセマフォ|バトンを渡す)

Process Reader[i=1 to M] { 
    while (true) { 
    /* Implementing <await (nw == 0) nr = nr+1;> */ 
    P(e); 
    if (nw > 0) {dr = dr+1; V(e); P(r);} 
    nr = nr + 1; 
    if (dr > 0) {dr = dr-1; V(r);} 
    else V(e); 
    read the database; 
    /* Implementing <nr = nr-1;> */ 
    P(e); 
    nr = nr - 1; 
    if (nr == 0 and dw > 0) {dw = dw-1; V(w);} 
    else V(e); 
    } 
} 

もともと私はラインと仮定:

/* Implementing <await (nw == 0) nr = nr+1;> */ 

が発生していたものにコメントの一部のようなものだったが、それは私が声明にあれば、ことになっていると思うだけで再読み込み持ちますP(e)ロックセマフォを制御する。以下は上記の前提に基づいて私のコードで実装したものです。

if (nw == 0) { 
    nr = nr++; 
    try { 
    e.acquire();//P(e) 
    } catch (InterruptedException e) { 
    } 
}//end if 

残りのコードの出力はちょっと混乱していますが、うまくいくようです。私はwritersプロセスに与えていたので、結果を妨げる可能性が高いと思われたので、私は遅延を使用することには注意が払われましたが、出力をより読みやすくするためにthread.sleepで遅延を使用しました。より長い遅延。しかし、理論的には、ロッキングシステムは健全でなければならず、遅れはコンソールをより読みやすくするだけですべきです。

したがって、上記の文ifを正しく使用していますか?

あなたは私にそれが(読者の嗜好/ライターの好み)必要として、それが動作するか検証するために、コンソールにデータを出力上の任意のヒントを与えることができます

答えて

0

ライン

/* Implementing <await (nw == 0) nr = nr+1;> */ 

は原子過程で、コード以下はそれを原子的に実行します。

誰かが他の質問に興味があった場合は、取得/リリースの下にprintステートメントを追加してください。