0

次のシナリオがあります。

1 つのタスクをいくつかのステージに分割します。各ステージには実際の作業を行うためのスレッドがいくつかあります。後のステージのスレッドは、現在のステージのすべてのスレッドが完了するまで待機する必要があります。

例えば:

スレッド 1、2、3 はステップ 1 の作業を行っています。

スレッド 4、5、6 はステップ 2 の作業を行っています。

スレッド 7、8、9 はステップ 3 を実行しています ...

各ステップのスレッドは独立していますが、前のステップのスレッドが終了するまで待機する必要があります。

これを達成したい方法は次のとおりです。

  1. 現在のステップの各スレッドで、現在のステップを開始できるかどうかを表す条件で待機します
  2. 現在のステップを開始できるようになると、すべてのスレッドが作業を開始し、バリアでこのステップのすべてのスレッドが終了するのを待ちます
  3. このステップのすべてのスレッドが終了した後、次のステップのスレッドが待機している条件変数でブロードキャストします

それは理にかなっていますか?ここで何か明らかに間違っていますか?

マルチスレッド プログラムの高水準言語構造にうんざりしており、pthread API を使用するのは苦痛です。ここで、このユース ケースのベスト プラクティスについてアドバイスが必要ですか? どうもありがとう

4

1 に答える 1

0

この質問に興味がある人のために。私はすでに実用的なソリューションを実装しています。yohjpがコメントしたように、これは典型的な並列/並行問題であると思います。

1 "Pipelined" tasks
2 "Join" on each of the stage

[num_stage] pthread バリアの配列と [num_stage+1] (pthread_cond_t, pthread_mutex_t) ペアの配列を使用しました。メインスレッドでは、もう 1 つの条件変数を使用して開始するためです。

サンプルコードが必要な方はメールでご連絡ください。これは課題の一部であり、コードを github に公開できませんでした。

これは未加工の pthread api を使用した初めての非試用マルチスレッド プログラムであり、非常に楽しい経験です :)

于 2013-01-28T09:47:48.593 に答える