thread_local和std :: future对象 - 对象的生命周期是多少?

时间:2017-04-05 07:25:00

标签: c++ c++11 future lifetime

这是我的测试代码:

vector<int> const & foo(int const counter)
{
    thread_local static vector<int> v{counter, counter + 1, counter + 2};
    return v;
}

int main()
{
    using myFut = future<vector<int> const &>;

    vector<myFut> futures;
    for(int i{0}; i < 5; ++i)
    {
        futures.push_back(async(launch::async, &foo, i * 3));
    }

    for(myFut & fut : futures)
    {
        vector<int> v{fut.get()}; // or vector<int> const & v{fut.get()};
        cout << v.size() << endl; // 0, I expect 3
    }

    return 0;
}

foo()返回时,可以销毁一个线程 - 与thread_local变量一起。但是,由于我使用std::future,变量的生命周期应该延长,直到调用std::future::get(),对吧?但在我的情况下,std::future返回一个空向量。那么规则是什么?

1 个答案:

答案 0 :(得分:2)

  

但是因为我使用std :: future,变量的生命周期应该延长,直到调用std :: future :: get(),对吧?

事实并非如此。 std :: async使用的线程将在与未来关联的set_value()上调用std::promise,然后可以自由终止。因此,您的线程局部变量可能会在std::future::get()返回之前或甚至在您调用它之前被销毁。