2017-07-30 48 views
1

这个想法是并行地对数组的每个元素执行操作。我想出了以下几点:用std :: async编辑数组

struct dataContainer 
{ 
    int value; 
    bool flag; 
    dataContainer() 
     : value(1) 
     , flag(true) 
    {} 
}; 


int main() 
{ 
    std::vector<dataContainer> arrData; 
    arrData.resize(10); 

    { 
     std::vector<std::future<void> > results; 
     std::for_each(arrData.begin(), arrData.end(), [&results](dataContainer& tData) { 

      results.emplace_back(std::async(std::launch::async, [](dataContainer& ttData) { 
       ttData.value++; 
       ttData.flag = false; 
      }, tData)); 
     }); 
    } 

    return 0; 
} 

但是,由std :: async调用的lambda不会对arrData的元素执行操作。其实,我不明白发生了什么事。看来,操作是在dataContainer的本地副本上执行的。

所以问题是怎么回事,以及如何以这种方式对数组元素执行操作?

+0

tData'的'最后一次出现在'async'通话 - 将其更改为'的std :: REF(TDATA)'。否则,它确实被价值捕获。 –

+0

是的,它有帮助。谢谢! –

回答

2

std::async以“decay copy”为参数。这意味着它在内部存储了参数的副本。这是必要的,因为通过转发引用跨越线程边界参数是非常危险的。

因此,如果你想要一个实际的参考传递给async功能,你必须使用std::ref

results.emplace_back(std::async(std::launch::async, [](dataContainer& ttData) { 
    ttData.value++; 
    ttData.flag = false; 
}, std::ref(tData)));