2017-04-05 2 views
1

Hier ist mein Testcode:thread_local und std :: future object - Wie hoch ist die Lebensdauer eines Objekts?

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; 
} 

Wenn foo() ein Thread kehrt zerstört werden kann - zusammen mit einer thread_local variabel. Aber da ich eine std::future benutze, sollte die Lebensdauer der Variablen bis zum Anruf auf std::future::get() verlängert werden, oder? Aber in meinem Fall gibt die std::future einen leeren Vektor zurück. Also, was sind die Regeln?

Antwort

2

Aber da ich ein std :: future verwende, sollte die Lebensdauer der Variablen bis zum Aufruf von std :: future :: get() verlängert werden, oder?

Das ist nicht der Fall. Der Thread, der von std :: async verwendet wird, ruft set_value() auf dem std::promise, das mit der Zukunft verknüpft ist, auf und kann dann frei terminiert werden. Daher kann Ihre thread-lokale Variable möglicherweise zerstört werden, bevor std::future::get() zurückgibt oder noch bevor Sie es aufrufen.

Verwandte Themen