gpt4 book ai didi

c++ - Lambda 内循环

转载 作者:可可西里 更新时间:2023-11-01 18:08:19 30 4
gpt4 key购买 nike

我在 for 循环中有一个 lambda,lambda 中有循环变量参数。当我运行它时,我希望输出数字 0-9。但由于它是一个 lambda,x 不会立即得到评估。

    for( int x = 0; x < n; ++x)
{
vec.push_back(thread{[&x](){
m.lock();
cout << x << endl;
m.unlock();
}});
}

输出:

0
3
3
9

等等

其他语言的解决方案是创建一个临时变量,

    for( int x = 0; x < n; ++x)
{
int tmp = x;
vec.push_back(thread{[&tmp](){
m.lock();
cout << tmp << endl;
m.unlock();
}});
}

但这似乎不起作用。

参见 Threads receiving wrong parameters

奖励:

在寻找答案的过程中,我偶然发现了这个问题 Generalizing C++11 Threads class to work with lambda建议不要使用会使迭代器无效的容器。为什么会这样/

最佳答案

当您指定捕获时,您可以在按值捕获和按引用捕获之间进行选择。您已选择通过引用捕获。通过引用捕获意味着 lambda 函数中的变量引用同一个对象。这意味着对此变量的任何更改都将被共享,您还需要确保引用的对象在 lambda 函数的生命周期内保持不变。

您可能想通过值来捕获。为此,您可以将捕获规范替换为 [=][x]。后者确保只能访问 x,而前者将允许访问其他变量。

顺便说一句,我建议不要显式地使用lock()unlock(),而是使用其中一种锁守卫。有了这个,你的循环体看起来像这样:

vec.push_back(std::thread{[x](){
std::lock_guard<std::mutex> kerberos(m);
std::cout << x << "\n";
}});

关于c++ - Lambda 内循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451755/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com