在创建新线程时在lambda中使用unique_ptr的线程安全性

时间:2016-08-07 12:00:03

标签: c++ multithreading c++11 lambda

我想知道以下代码是否是线程安全的

void use_value(int i, unique_ptr<vector<int>> v);
for (int i = 0; i < 10; i++){
    unique_ptr<vector<int>> ptr = make_unique<vector<int>>(10);
    // ...
    // Here, the vector pointed to by ptr will be filled with specific values for each thread.
    // ....
    thread(
        [i, &ptr](){
            use_value(i, move(ptr));
        }
    );
}

谢谢

1 个答案:

答案 0 :(得分:3)

这是未定义的行为。你不知道什么时候会调用lambda体。因此,您通过引用捕获的ptr很可能超出范围,资源被破坏,并且您将留下悬空参考。

如果您有权使用c ++ 14,则应该"move-capture" ptr(或者更好,只有vector)进入lambda。

如果移动(或复制)向量,则代码线程安全。