假设我有一个包含100个元素的向量,并且Func1和Func2。在单线程版本Func1中处理矢量元素,并且当Func1完成时,Func2必须在元素上启动其他过程。
我很好奇我是否按照以下顺序使用QtConcurrent::map
,Func1和Func2实际将按哪个顺序执行?
QFuture<void> future;
future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);
我必须提到,使用future.waitForFinished()
会阻塞我不需要的应用程序主线程。
future = QtConcurrent::map(vector, Func1);
future.waitForFinished();
future = QtConcurrent::map(vector, Func2);
我也不想在辅助线程中执行那些QtConcurrent::map
并在那里执行future.waitForFinished()
,因为在这种方法中,我将失去线程池中的一个线程。
因此,问题是QtConcurrent::map
添加的任务是否按顺序执行?
编辑
在单线程和多线程方法中,Func2必须仅在Func1完成对所有元素的处理后才能运行。
答案 0 :(得分:2)
由于您希望在完成对Func1
的所有调用之前完成对Func2
的所有调用,因此您无法在已知第QtConcurrent::map
的一次调用结束之前进行第二次调用。
但是,您不必使用future.waitForFinished()
,而可以使用QFutureWatcher
...
QFutureWatcher<void> watcher;
auto future = QtConcurrent::map(vector, Func1);
QObject::connect(&watcher, &QFutureWatcher::finished,
[&]()
{
/*
* All calls to Func1 have finished so it's
* safe to invoke Func2.
*/
future = QtConcurrent::map(vector, Func2);
});
watcher.setFuture(future);
以上内容未经测试,但希望可以使您了解所需的内容。
答案 1 :(得分:0)
可悲的是,我无法从文档中找到答案,因此我已经测试了这段代码
future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);
,结果是对于向量Func2的某些元素,它在Func1之前开始。同样,使用QtConcurrent::map
自然没有处理矢量元素的顺序。
为解决我的问题,我将具有同时调用QtConcurrent::map
的插槽的对象移动到另一个线程,并使用了wait
,这将导致我的线程池丢失一个线程。