使用std :: async编辑数组

时间:2017-07-30 15:17:01

标签: c++11 asynchronous stl

这个想法是并行地对数组的每个元素执行操作。我想出了以下内容:

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的本地副本上执行的。

所以问题是发生了什么,以及如何以这种方式对数组元素执行操作?

1 个答案:

答案 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)));