Lambda函数C ++:捕获循环的索引会有所不同吗?

时间:2016-05-07 00:41:39

标签: c++ multithreading lambda

在下面的for循环中的两个lambdas中,专家(或者至少比我更专业的人)推荐使用'j'索引,这在第二个循环中显示。我想理解为什么在功能上,输出没有区别。

我的可执行程序在Github here上。

for(int j = 0;j<recPtr->numThreads;j++){

    recPtr->heads[j] = 0;
    recPtr->tails[j] = 0;
    headsPtr = &recPtr->heads[j]; // Get the address of the index of the array, one element for each thread for heads.
    tailsPtr = &recPtr->tails[j]; // Get the address of the index of the array, one element for each thread for heads.

    threads.push_back(thread([headsPtr, tailsPtr, timesToToss]()
    {
        for(int k=0;k<timesToToss;k++)
        { 
            if (Tosser(dre)) ++(*headsPtr); 
            else ++(*tailsPtr); 
        } 
    })); //Toss a coin!
}


for (int j = 0; j < recPtr->numThreads; j++)
{

    recPtr->heads[j] = 0;
    recPtr->tails[j] = 0;
    headsPtr = &recPtr->heads[j]; // Get the address of the index of the array, one element for each thread for heads.
    tailsPtr = &recPtr->tails[j]; // Get the address of the index of the array, one element for each thread for heads.

    threads.push_back(thread([j, headsPtr, tailsPtr, timesToToss]()
    {
        for(int k=0;k<timesToToss;k++)
        {   
            if (Tosser(dre)) ++(*headsPtr);
            else ++(*tailsPtr);
        }
    })); //Toss a coin!
}

2 个答案:

答案 0 :(得分:2)

lambda不使用j,因此没有理由捕获它。它没有给你带来任何好处。

但是你的{@ 1}}使你的封闭更大,会产生额外的int份副本,并且还会混淆你的代码(包括你自己)的未来观众,他们可能想知道之前的迭代是代码之前需要int

所以不要抓住j

答案 1 :(得分:0)

在lambda中通过值捕获变量j是多余的,因为你没有在lambda体中使用它...

但另一方面,如果在lambda体中使用j则是,则需要捕获它才能使用。有关lambda capture here

的更多信息

这是一个小例子:

int main()
{
    int j { 9 };
    auto lambda = [ ]() { cout << j << '\n'; };
               //  ^  error 'j' not captured

    lambda();
}