Multithreading 多个QtConcurrent::map执行顺序

Multithreading 多个QtConcurrent::map执行顺序,multithreading,qt,dictionary,threadpool,qtconcurrent,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); 另外,我不

假设我有一个100个元素的向量,Func1和Func2。在单线程版本的Func1进程向量元素中,当Func1完成时,Func2必须对元素启动不同的进程。 我很想知道我是否按以下顺序使用
QtConcurrent::map
,Func1和Func2将按哪个顺序执行

QFuture<void> future;
future = QtConcurrent::map(vector, Func1);
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
,我将在线程池中丢失一个线程。

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

future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);
结果是,对于向量的某些元素,Func2在Func1之前开始。此外,使用
QtConcurrent::map
处理向量元素也没有顺序


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

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

但是,与其调用
future.waitForFinished()
,不如使用

QFutureWatcher-watcher;
auto future=QtConcurrent::map(向量,Func1);
QObject::connect(&watcher,&QFutureWatcher::已完成,
[&]()
{
/*
*对Func1的所有调用都已完成,因此它是
*可以安全地调用Func2。
*/
future=QtConcurrent::map(向量,Func2);
});
watcher.setFuture(未来);

以上内容未经测试,但希望能让您了解所需的内容。

由于您希望在调用
Func2
之前完成对
Func1
的所有调用,因此在第一个调用完成之前,您不能再调用
QtConcurrent::map

但是,与其调用
future.waitForFinished()
,不如使用

QFutureWatcher-watcher;
auto future=QtConcurrent::map(向量,Func1);
QObject::connect(&watcher,&QFutureWatcher::已完成,
[&]()
{
/*
*对Func1的所有调用都已完成,因此它是
*可以安全地调用Func2。
*/
future=QtConcurrent::map(向量,Func2);
});
watcher.setFuture(未来);

以上内容未经测试,但希望能让您了解所需的内容。

如果您想同时运行两个任务,为什么需要保留执行顺序?您能否澄清所需的精确顺序。您是否要求
Func1
Func2
开始之前对
vector
的所有元素进行操作,或者(更可能)您只要求
Func1
vector[i]
之前对
vector[i]
进行操作。如果是后者,则只需使用第三个函数对传递的参数调用
Func1
,然后调用
Func2
。@vahancho我不想同时运行Func1和Func2。我需要Func1以并发方式在向量的不同元素上运行。类似于循环的并行
@G.M.我需要在Func2开始之前完成Func1。谢谢你的回复。@G.M.是的。我想我已经在问题的编辑部分澄清了这一点。谢谢。如果您想同时运行两个任务,为什么需要保留执行顺序?您能否澄清您需要的精确顺序。您是否要求
Func1
Func2
开始之前对
vector
的所有元素进行操作,或者(更可能)您只要求
Func1
vector[i]
之前对
vector[i]
进行操作。如果是后者,则只需使用第三个函数对传递的参数调用
Func1
,然后调用
Func2
。@vahancho我不想同时运行Func1和Func2。我需要Func1以并发方式在向量的不同元素上运行。类似于
循环的并行
@G.M.我需要在Func2开始之前完成Func1。谢谢你的回复。@G.M.是的。我想我已经在问题的编辑部分澄清了这一点。谢谢,很好的方法。完全有效。我测试过了。但有一个问题,我认为更多的线程可以提高程序速度,相比我的解决方案和你的解决方案,速度提高没有明显的区别。有什么想法吗?我的全局实例有8个线程,一个用于主应用程序事件循环,另一个用于读取数据。因此,对于您的方法,有6个线程可用,而对于我的方法,有5个线程可用。我假设速度差必须是可见的,因为这1个线程。我的代码中有一种方法可以观察待处理队列中的向量。我猜我使用的是6个线程,而不是5个线程。我使用
QtConcurrent::blockingMap
作为我的

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);