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

时间:2020-06-03 16:14:07

标签: c++ multithreading lambda

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

为什么Box10不是1。我知道代码有问题。不知道到底是什么问题。 lambda在这里到底如何工作?

1 个答案:

答案 0 :(得分:4)

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

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

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