我在lambda表达式中有一个带有循环变量参数的for循环中的lambda。当我运行它时,我期望输出数字0-9。但由于它是一个lambda,所以x不会立即得到评估。Lambda循环内
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表达式中的&。对于这个过于简单的例子,是的lock_guard是适当的。但是在实际的应用中,函数做了很多事,不需要被锁定。在这种情况下,互斥体只适用于重要部分的锁定和解锁,对吗? – SaulBack
@SaulBack:不,你应该使用'lock_guard'。如果您只想锁定某些代码,请使用带有{}的显式块来封闭已锁定的代码。这里是基本的RAII编码。 –
@SaulBack:特别是在你想使用RAII的复杂代码中,例如'std :: lock_guard'!在这个**微不足道的例子中,我可以看到它不是必需的,但是现在它有点复杂了。如果您需要限制锁定的范围,请使用一个范围,即一对大括号:'{<锁定和代码需要它放在这里>}。 –