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在这里到底如何工作?
您的代码具有潜在的不确定行为。捕获列表也[&]
捕获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)));
}));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句