这个想法是并行地对数组的每个元素执行操作。我想出了以下内容:
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 :(得分:3)
std::async
通过“衰减副本”获取参数。这意味着它在内部存储参数的副本。这是必要的,因为通过转发引用跨越线程边界编组参数是非常危险的。
因此,如果您要将实际引用传递给async
函数,则必须使用std::ref
:
results.emplace_back(std::async(std::launch::async, [](dataContainer& ttData) {
ttData.value++;
ttData.flag = false;
}, std::ref(tData)));