class Box {
int _value;
public:
Box(int value_):_value(value_) {}
int getValue() const {return _value;}
};
void setBox(unsigned value, Box& box_) {
box_ = value == 1 ? Box(1): Box(2);
}
int main()
{
Box box1(0), box2(0);
std::vector<std::thread> threadList;
for(unsigned value : {1, 2}) {
threadList.push_back(
std::thread([&](){
setBox(
value,
(value == 1 ? std::ref(box1) : std::ref(box2)));
}));
}
for(auto& thread:threadList) {
thread.join();
}
std::cout << "Box1:" << box1.getValue() << std::endl;
std::cout << "Box2:" << box2.getValue() << std::endl;
}
输出
Box1:0
Box2:2
为什么Box1
值0
不是1
。我知道代码有问题。不知道到底是什么问题。 lambda在这里到底如何工作?
答案 0 :(得分:4)
您的代码具有潜在的不确定行为。捕获列表[&]
也捕获value
作为参考。 value
是for
循环中的局部变量,在迭代结束后将被破坏,捕获的引用将变为悬空状态。
您可以将其更改为按值捕获value
。
for(unsigned value : {1, 2}) {
threadList.push_back(
std::thread([&,value](){
// ^^^^^^
setBox(
value,
(value == 1 ? std::ref(box1) : std::ref(box2)));
}));
}