2015-12-22 9 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(); 
} 

Dlaczego muszę zadzwonić pod numer t.join() po tym, jak zadzwonię pod numer f.get()? Myślałem, że f.get() zablokuje główny wątek, dopóki nie uzyska wyniku, a to oznacza, że ​​wątek już się zakończył.Dlaczego muszę dołączyć do wątku, nawet jeśli używam std :: future :: get?

Odpowiedz

2

Ponieważ nawet po zakończeniu wykonywania wątku nadal można go dołączyć. Możesz zadzwonić pod numer detach, aby umożliwić niezależne wykonanie. W tym przypadku warto skorzystać set_value_at_thread_exit element z promise aby zmniejszyć prawdopodobieństwo, że main wykończenia przed wątku:

#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

wierzę uzasadnienie wątków jest po prostu, że albo wyraźnie je albo że przyłączyć jawnie je odłączyć, ale jeśli obiekt wątku zostanie zniszczony, zanim to się stanie, prawdopodobnie masz problem z projektem. Decyzja nie polegała na założeniu, że chcesz ją odłączyć lub dołączyć do niej, gdy wywoływany jest destruktor, ponieważ w większości sytuacji jedno z nich jest złe.

Co więcej, w twoim przypadku nie ma znaczenia, skąd przyszłą przyszłość. Wymagania dotyczące obiektu wątku nie są dotykane przez to, jak wyzwala przyszłość, pozostają takie same.

Należy pamiętać, że w twoim przypadku, ponieważ wątek już nie interesuje, możesz go po prostu odłączyć.

Powiązane problemy