线程C ++的lamda内部的函数调用

维维克
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在这里到底如何工作?

songyuanyao

您的代码具有潜在的不确定行为。捕获列表也[&]捕获value作为参考。valuefor循环中的局部变量,在迭代结束时将被销毁,之后捕获的参考将变为悬挂状态。

您可以将其更改为value按值捕获

for(unsigned value : {1, 2}) {
    threadList.push_back(
        std::thread([&,value](){
        //            ^^^^^^
                setBox(
                    value,
                    (value == 1 ? std::ref(box1) : std::ref(box2)));
            }));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章