以下のコードは、Java でのバトンの受け渡しプログラムの一部です。
メイン P1(ライター) P2(ライター) P3(リーダー) P4(リーダー)
主要();
package ReadersPreference;
import java.util.concurrent.Semaphore;
/**
* * @author me
*/
public class Main {
public static void main(String[] args) {
AnyData x = new AnyData(5.7);//gives writers something to write,
//readers something to read
Semaphore e = new Semaphore(1);//control entry
Semaphore r = new Semaphore(0);//used to delay readers
Semaphore w = new Semaphore(0);//used to delay writers
int nr = 0;//readers active
int nw = 0;//writers active
int dr = 0;//readers waiting
int dw = 0;//writers waiting
P1 r1 = new P1(e, r, w, x, nr, nw, dr, dw); // #reader thread 1
P2 r2 = new P2(e, r, w, x, nr, nw, dr, dw); // #reader thread 2
P5 r3 = new P5(e, r, w, x, nr, nw, dr, dw); // #reader thread 3
P6 r4 = new P6(e, r, w, x, nr, nw, dr, dw); // #reader thread 4
P3 w1 = new P3(e, r, w, x, nr, nw, dr, dw); // #writer thread 1
P4 w2 = new P4(e, r, w, x, nr, nw, dr, dw); // #writer thread 2
System.out.println("threads commanded to start");
r1.start(); // calls run() method in Thread
r2.start();
r3.start();
r4.start();
w1.start();
w2.start();
}//end of main
}//end of class
読者のプロセス
package ReadersPreference;
import java.util.concurrent.Semaphore;
public class P1 extends Thread {
private Semaphore e;
private Semaphore r;
private Semaphore w;
private AnyData pillarbox;
private int nw;
private int nr;
private int dr;
private int dw;
public P1(Semaphore e, Semaphore r, Semaphore w, AnyData pbox,
int nw, int nr, int dr, int dw) {
this.nw = nw;
this.nr = nr;
this.dr = dr;
this.dw = dw;
this.e = e;
this.r = r;
this.w = w;
pillarbox = pbox;
}// end of constructor
public void run() {
PERFORM OPERATIONS
}// end of run method
}// end of class
今、私の出力によると、それはうまくいくようです。しかし、私の講師は 2 つの大きな欠点を指摘しています。1 つは、カウンター (nr、nw、dr、dw) が参照ではなく値によって渡されることです。各スレッドは、共有変数を操作するのではなく、データの独自のコピーをチェックすることを意味します。これにより、プログラムが正常に動作しなくなります。
私は値と参照による受け渡しについて多くのことを読んできましたが、最初は頭が腫れているように感じました。今ではほとんど理解していると思いますが、まだ解決策が見られません。セマフォがすでに参照であるため、セマフォが機能する理由を理解できます (むしろ、渡される値は参照です)。カウンターの問題が正確にどこにあるのか、またはそれを解決する方法がわかりません。
彼がスレッドと言うとき、彼はプロセス クラス (コンストラクター/アルゴリズム) またはメイン クラスのインスタンス化、またはその両方を指しますか?
プリミティブをオブジェクトとして共有することを読んだことに基づいて、私が思いついた解決策に最も近いのは次のとおりです。
public void setCounters(int nr){nr = newNR;}
繰り返しますが、私はそれを実装する方法について漠然としています
2 つ目の重大な欠陥と思われるのは、2 つ (リーダー/ライター) を作成して必要な数のオブジェクトを使用するのではなく、いくつかのプロセス クラス ファイルを作成し、それぞれをスレッドとして実行したことです。私はこれが何を意味するのかあいまいですが、出力の印刷ステートメントが各プロセスに固有であることを考慮して、検証のために出力でそれぞれを一意に識別します。目的のために行われたときに、なぜこの方法が欠陥と見なされるのでしょうか。リーダー/ライターへのソリューションに影響しますか?