2017-04-05 2 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()이 반환되기 전에 또는 호출하기 전에 파손될 수 있습니다.

관련 문제