多个QtConcurrent :: map执行顺序

时间:2020-06-16 06:34:45

标签: multithreading qt dictionary threadpool qtconcurrent

假设我有一个包含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完成对所有元素的处理后才能运行。

2 个答案:

答案 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,这将导致我的线程池丢失一个线程。