C++ 对以下异步行为感到困惑
我试图找出以下代码,但不确定std::async部分在做什么:C++ 对以下异步行为感到困惑,c++,C++,我试图找出以下代码,但不确定std::async部分在做什么: std::vector<double> RunParallel( std::vector<std::vector<int>> args) { std::vector<std::future<double>> results(args.size()); for( int iter_job = 0; iter_job < args.size(); +
std::vector<double> RunParallel( std::vector<std::vector<int>> args)
{
std::vector<std::future<double>> results(args.size());
for( int iter_job = 0; iter_job < args.size(); ++iter_job )
{
int arg1 = args[iter_job][0];
int arg2 = args[iter_job][1];
results[iter_job]= std::async(std::launch::async, [&]
{ return (foo(arg1,arg2)); });
}
std::vector<double> returnValues;
for(int iter_job =0; iter_job<args.size(); ++iter_job)
{
returnValues.push_back(results[iter_job].get());
}
}
std::vector运行并行(std::vector args)
{
向量结果(args.size());
对于(int iter_job=0;iter_job[&]{return(foo(arg1,arg2));}
是一个lambda表达式,它生成一个不带参数的闭包,并在调用时返回foo(arg1,arg2)
arg1
和arg2
通过闭包中的引用捕获。这意味着一旦for
循环的迭代结束,闭包将保持悬空引用。这可能是问题的原因
改为按值捕获arg1
和arg2
:
[arg1, arg2]{ return foo(arg1, arg2); }
使用默认的
&
或=
捕获通常是一个坏主意,因为它们可能会引入微妙的错误。除非您有很好的理由不这样做,否则最好显式列出捕获。for循环中没有返回
,返回
在传递给async
的函数中
问题在于,函数正在通过引用捕获arg1
和arg2
,并且在将来调用时,这些对象不再存在,因此尝试访问它们是未定义的
将捕获列表[&]
替换为[arg1,arg2]
以按值捕获它们。(并抛出一个空的参数列表,以便更好地度量:
[arg1,arg2](){…}
)您可能还需要添加foo()函数。这听起来是正确的,因为奇怪的结果是返回向量中的重复值,而不是并行运行生成的唯一值。是否使用[=]消除悬空引用?@steviekm3:它通过值捕获所有内容,因此是的。请不要忽略我关于&
和=
的建议。您也可以调用std::async(std::launch::async,foo,arg1,arg2)
并避免捕获lambdaYes我将更改代码以列出捕获。我不确定为什么在这种情况下,代码使用捕获lambda而不是只执行函数调用。