我有一个单线程的 linux 应用程序,我想使其并行。它读取一个数据文件,创建对象,并将它们放在一个向量中。然后它在每个对象上调用一个计算密集型方法(0.5 秒+)。我想在创建对象的同时调用该方法。虽然我看过 qt 和 tbb,但我对其他选项持开放态度。
我计划在向量为空时启动线程。每个人都会调用makeSolids
(如下),它有一个 while 循环,该循环将一直运行,直到 interpDone==true 并且向量中的所有对象都已被处理。但是,在线程方面,我是 n00b,我一直在寻找现成的解决方案。
QtConcurrent::map(Iter begin,Iter end,function())
看起来很简单,但我不能在大小变化的矢量上使用它,可以吗?我如何告诉它等待更多数据?
我还查看了英特尔的 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
}
}
}
编辑:总而言之,在主线程填充向量的同时处理向量的最简单方法是什么?