多个QtConcurrent::map执行顺序

Multiple QtConcurrent::map execution order

假设我有一个包含 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 处理完所有元素后。

遗憾的是我无法从文档中找到答案,所以我测试了这段代码

future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);

结果是对于向量的某些元素,Func2 在 Func1 之前开始。也没有使用 QtConcurrent::map 自然处理向量元素的顺序。

为了解决我的问题,我将带有同时调用两个 QtConcurrent::map 的插槽的对象移动到另一个线程并使用 wait,这将在我的线程池中丢失一个线程。

由于您希望在对 Func2 的任何调用之前完成对 Func1 的所有调用,因此您不能在已知第一个调用之前对 QtConcurrent::map 进行第二次调用完成。

但是,您可以使用 QFutureWatcher...

而不是调用 future.waitForFinished()
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);

以上内容未经测试,但希望能让您了解需要什么。