【发布时间】:2015-01-13 21:44:34
【问题描述】:
我正在开发一个我想在循环中使用异步的程序。在我包含的示例代码中,只有 10 个元素,因此我可以轻松地为每个元素创建一个显式变量。但是,在我的主程序中,向量中的元素数量可能会有所不同。理想情况下,我想创建一个异步线程向量 - 数组中的每个元素一个 - 在我循环时被推回异步向量。然后我想等待它们全部完成,然后使用“ get()" 返回所有输出。
下面的代码将通过为每个线程分配一个显式变量来调用 async,但是有谁知道如何在向量中动态调用 async 而不必显式地为其分配一个变量?理想情况下,我希望这个程序在每次循环时调用一次“std::cout”,而不是只调用一次。
#include <iostream>
#include <vector>
#include <string>
#include <future>
std::string hi (std::string input)
{
return "hello, this is " + input;
}
int main()
{
std::vector<std::string> test_vector( 10, "a test" );
std::future<std::string> a;
std::future<std::string> b;
for ( int i = 0; i < test_vector.size ( ); i++ )
{
a = std::async(std::launch::async, hi, test_vector[i]);
}
std::cout << a.get() << std::endl;
return 0;
}
【问题讨论】:
-
你的问题到底是什么?
-
如何在每次循环通过时动态调用异步,而不必显式创建变量。
-
上面写的代码有一个严重的缺陷,每次你为
a分配一个新的未来时,你强制它阻塞并等待与其旧值关联的线程完成,所以你'重新有效地串行运行。无论如何,我很惊讶动态数量的期货的解决方案并不完全显而易见:将每个新的未来存储在一个动态大小的容器中,就像一个向量。您甚至自己说过:“我想创建一个异步线程向量 - 数组中的每个元素一个 - 在我循环时这些线程被推回异步向量。” 那么为什么你不是刚做的吗! -
矢量是我描述它的最佳方式,我尝试过使用这种东西但没有任何加速,想看看其他人的建议,虽然这似乎是唯一的这样做的方法,我的程序没有运行得更快。
-
也许异步函数会递归调用自己?我不知道这是否可能,你将不得不等待调用第一个函数的开销,但是一旦你有两个运行,这两个将调用另外两个,它会递归增长。也许这就是你正在寻找的。使用互斥锁设置一个全局变量,以便线程可以看到调用了多少线程并中断递归。
标签: c++ multithreading c++11 concurrency