2017-04-05 124 views
1

這裏是我的測試代碼:thread_local和std :: future對象 - 對象的生命週期是什麼?

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返回一個空向量。那麼規則是什麼?

回答

2

但由於我使用std :: future,變量的生命週期應該延長到調用std :: future :: get(),對吧?

情況並非如此。 std :: async使用的線程將在與未來相關聯的std::promise上調用set_value(),然後它可以自由終止。因此,您的線程局部變量可能會在std::future::get()返回之前甚至在您調用之前被銷燬。