C++ 对以下异步行为感到困惑

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::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(); ++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而不是只执行函数调用。