並列にしたいシングルスレッドのLinuxアプリがあります。データ ファイルを読み取り、オブジェクトを作成し、それらをベクトルに配置します。次に、各オブジェクトで計算集約型のメソッド (0.5 秒以上) を呼び出します。オブジェクト作成と並行してメソッドを呼び出したい。私は qt と tbb を見てきましたが、他の選択肢も受け入れています。
ベクトルが空のときにスレッドを開始する予定でした。それぞれがmakeSolids
(下記) を呼び出します。これには、interpDone==true まで実行され、ベクター内のすべてのオブジェクトが処理されるまで実行される while ループがあります。ただし、私はスレッド化に関しては無頓着であり、既製のソリューションを探していました。
QtConcurrent::map(Iter begin,Iter end,function())
非常に簡単に見えますが、サイズが変化するベクターには使用できませんよね? さらにデータを待つようにするにはどうすればよいでしょうか。
intel の tbb も見ましたが、parallel_for
orを使用するとメインスレッドが停止するように見えましparallel_while
た。彼らのメモリマネージャーが推奨されていたので、それは悪臭を放ちます(オープンカスケードの mmgt はマルチスレッド化するとパフォーマンスが低下します)。
/**intended to be called by a thread
\param start the first item to get from the vector
\param skip how many to skip over (4 for 4 threads)
*/
void g2m::makeSolids(uint start, uint incr) {
uint curr = start;
while ((!interpDone) || (lineVector.size() > curr)) {
if (lineVector.size() > curr) {
if (lineVector[curr]->isMotion()) {
((canonMotion*)lineVector[curr])->setSolidMode(SWEPT);
((canonMotion*)lineVector[curr])->computeSolid();
}
lineVector[curr]->setDispMode(BEST);
lineVector[curr]->display();
curr += incr;
} else {
uio::sleep(); //wait a little bit for interp
}
}
}
編集: 要約すると、メイン スレッドがベクターにデータを入力すると同時にベクターを処理する最も簡単な方法は何ですか?