2015-12-22 7 views
5
void 
set_string(std::promise<std::string>& p) 
{ 
    p.set_value("set from thread"); 
} 

int 
main() 
{ 
    std::promise<std::string> p; 
    std::future<std::string> f = p.get_future(); 
    std::thread t(&set_string, std::ref(p)); 
    std::cout << f.get() << std::endl; 
    t.join(); 
} 

Warum muss ich t.join() anrufen, nachdem ich f.get() anrufen? Ich dachte, dass f.get() den Haupt-Thread blockieren wird, bis es das Ergebnis erhalten kann, und das würde bedeuten, dass der Thread bereits beendet ist.Warum muss ich einem Thread beitreten, auch wenn ich std :: future :: get verwende?

Antwort

2

Da selbst nach Ausführung des Threads noch Joinable möglich ist. Sie können detach aufrufen, um eine unabhängige Ausführung zu ermöglichen. In diesem Fall sollten Sie set_value_at_thread_exit Mitglied von promise verwenden Chance zu verringern, dass main Oberflächen vor thread:

#include <iostream> 
#include <string> 
#include <thread> 
#include <future> 

void set_string(std::promise<std::string>& p) 
{ 
    p.set_value_at_thread_exit("set from thread"); 
} 

int main() 
{ 
    std::promise<std::string> p; 
    std::future<std::string> f = p.get_future(); 
    std::thread(&set_string, std::ref(p)).detach(); 
    std::cout << f.get() << std::endl; 
} 

http://coliru.stacked-crooked.com/a/1647ffc41e30e5fb

2

Ich glaube einfach die Gründe für Threads sind, dass Sie entweder explizit beitreten oder, dass Sie entferne sie explizit, aber wenn ein Thread-Objekt zerstört wird, bevor es passiert ist, hast du wahrscheinlich ein Problem mit deinem Design. Die Entscheidung sollte nicht davon ausgehen, dass Sie es trennen oder es beitreten wollen, wenn der Destruktor aufgerufen wird, da in den meisten Situationen beides falsch ist.

Für Ihren Fall spielt es keine Rolle, wo die Zukunft eingestellt wird. Die Anforderungen an das Thread-Objekt werden nicht dadurch berührt, wie es die Zukunft auslöst, sie bleiben gleich.

Beachten Sie, dass in Ihrem Fall, da Sie sich nicht mehr für den Thread interessieren, Sie ihn einfach lösen könnten.

Verwandte Themen