質問

これは学業です。 ピアツーピアスレッドモデルを作成しようとしています。

http://www.informit.com/articles/article。 ASPX?P= 169479& SEQNUM= 5

委任モデルにタスクをワーカースレッドに委任するボススレッドがある場合は、ピアツーピアモデルですべてのスレッドに等しい動作状態が等しい。すべてのタスクを実行するために必要なすべてのスレッドを最初に作成するシングルスレッドがありますが、そのスレッドはワーカースレッドと見なされ、委任ができません。このモデルでは、集中型のスレッドはありません。

SOマイメインスレッドWilllは5つのスレッドを作成し、それが私のキューを聴取し始め、10秒間メインスレッドでジョブを作成します。また、すべてのスレッドがタスクを実行する必要があるため、このスレッドもジョブを待つ必要があります。どうやってこれを行うことができますか?

BlockingQueue<Job> queue = new ArrayBlockingQueue<Job>(1000);

    Collection<Thread> workers = new ArrayList<Thread>();
    for(int i = 0; i < 5; i++) {
        Thread thread = new Thread(new Worker(queue));
        workers.add(thread);
        thread.start();
    }

    long endTime = System.currentTimeMillis() + 10000;
    Random r = new Random();
    while(System.currentTimeMillis() < endTime) {
        try {
            CalculateJob job = new CalculateJob(r.nextInt(50), r.nextInt(50), r.nextInt(50));
            queue.put(job);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }   
.

だから私のメインスレッドはスレッドの作成と一緒に作業し、労働者はqueue.take()で座っています。

ピアツーピアモデルでは、すべてのスレッドがジェネラコデタグコードまたはジョブを待つ必要があることを正しく理解しています。もしそうなら、どうすれば私はこれをすることができますか?どんな提案ですか?

役に立ちましたか?

解決

あなたがリンクした記事は、ジョブの作成方法を言うことになりません。彼らはおそらく彼らが他の場所から作られていることを意味します。それぞれのモデルの数値を見て、私たちはそれを見ます:

  • 「代表団モデル」では、メインスレッドはどのワーカースレッドがジョブを実行するかを決定します。
  • 「ピアツーピアモデル」では、ピアスレッドが共通のキューから作業します(そして最初に次のジョブが最初に発生する場合はどちらか、どちらのスレッドが発生するのか)、ピアスレッドが自分自身を調整します。

    ConcurrentQueueを使用することで、実際にピアツーピアモデルを実装しました。

    要約すると、それらがする区別は、作業の作成方法ではなく、糸が作業をどのように調整するかです。

他のヒント

あなたが提供した記事を提案したように

ピアツーピアモデルでは、すべてのスレッドに等しい動作状態があります。すべてのタスクを実行するために必要なすべてのスレッドを最初に作成するシングルスレッドがありますが、そのスレッドはワーカースレッドと見なされ、委任がない

労働者であることが起こる上司のスレッドは、キューに入れられたジョブを作成し、ジョブを入れることで終わったらtake()を呼び出すことによって労働者のように機能することができます。

ボススレッドがジョブの作成を終了するまで、すべてのスレッドをブロックしたい場合は、CountDownLatchを単一カウントで使用できます。

私は本当にこのモデルが私たちのプロデューサー/コンシューマモデルを持っているかどうかわからない。

WookScrewモデルが並行性の一般的な概念であるかのように聞こえるという事実のために、CでPSUEDOコードを追加します。

ワークスケールモデルとしても知られているピアモデルでは、1つのスレッドが必要です プログラムが起動したときに他のすべてのピアスレッドを作成します。このスレッド その後、要求を処理する別のピアスレッドだけとして機能します。 または他のピアが終了するのを待っているかを中断します。ピア モデルは各スレッドをそれ自身の入力を担当します。ピアは知っています それ自身の入力が早めに、それを入手する独自のプライベートな方法があります 入力、または他のピアとの入力点を共有します。

画像の説明がここに入力されています

main()
{
   pthread_create( ... thread1 ... task1 )
   pthread_create( ... thread2 ... task2 )
   .
   .
   .
   signal all workers to start
   wait for all workers to finish
   do any clean up
}

task1()
{
   wait for start
   perform task, synchronize as needed if accessing shared resources
   done
}

task2()
{
   wait for start
   perform task, synchronize as needed if accessing shared resources
   done
}
.

すべてのソースは Pthreadsプログラミング - より良いマルチプロセッシング、Buttlar、FarrellのためのPOSIX規格、 Nichols

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top