关于while循环内调用tbb::parallel_for的执行顺序确认
关于tbb::parallel_for在循环中的执行顺序确认
你的理解完全正确。不管是while循环还是你示例里的for循环,这类串行循环的每一次迭代都会阻塞等待当前迭代内的tbb::parallel_for完全执行完毕后,才会进入下一次迭代。
原因很明确:tbb::parallel_for是一个同步调用——它会启动线程并行处理任务,但调用这个函数的主线程会一直等待,直到所有并行任务执行完成、所有工作线程退出后,才会继续执行后续代码。
对应你给出的伪代码(修正了语法细节):
map<int, vector<object*>> objmap; for(auto& objvec : objmap) { tbb::parallel_for( tbb::blocked_range<vector<object*>::iterator>(objvec.begin(), objvec.end(), grainsize), someObject, tbb::simple_partitioner() ); }
在这个for循环里:
- 第一次迭代启动的
parallel_for会并行处理第一个objvec的所有元素,主线程会卡在这个parallel_for调用处,直到所有并行任务结束 - 只有等第一次的
parallel_for完全执行完,主线程才会进入第二次迭代,启动下一个parallel_for处理第二个objvec
这种特性刚好能满足你“第二次迭代依赖第一次迭代结果”的需求,完全不需要额外添加同步措施,TBB的parallel_for本身的同步特性就保证了循环迭代的串行顺序。
内容的提问来源于stack exchange,提问作者user6042013
相关产品推荐
相关产品推荐

