2016-12-16 1 views
6
#include <iostream> 
#include <string> 
#include <thread> 
#include <future> 


int main() 
{ 
    auto pms = std::promise<std::string>(); 
    auto ftr = pms.get_future(); 

    std::thread([&](){pms.set_value("hello world");});  
    ftr.wait(); 
    std::cout << ftr.get() << std::endl; 

    return 0; 
} 

Selon this link, std::future::wait blocs jusqu'à ce que le résultat devient avaiable.
Pourquoi ne pas l'avenir :: attente() bloquer

Cependant, le code ci-dessus ne peut rien imprimer. Évidemment le fil principal a fini avant que le fil de pms.set_value finisse.

Pourquoi ne pas ftr.wait() bloquer?

+0

Je vous suggère de jeter un oeil à std :: async – LeDYoM

Répondre

9

Le problème n'est pas que std::future::wait ne bloque pas. Le vrai problème est que vous avez une condition de concurrence entre le thread que vous avez engendré, son travail et la destruction de l'objet (temporaire) std::thread dans le thread principal.

À cause de cela, abort est appelé dans le destructeur de std::thread si le thread est encore jointable.

Code de travail:

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

int main() 
{ 
    auto pms = std::promise<std::string>(); 
    auto ftr = pms.get_future(); 

    std::thread thread ([&](){pms.set_value("hello world");});  
    ftr.wait(); 
    std::cout << ftr.get() << std::endl; 
    thread.join(); 
    return 0; 
} 

Notez que si vous ne joignez pas le thread explicitement, vous auriez toujours la même condition de course (car il est possible que main peut faire plus rapidement ses travaux, que le thread peut nettoyer lui-même jusqu'à

Demo de l'exemple de travail:.. here

+3

upvoted pour ne suggère pas détacher le fil. –

0

Sinon, vous pouvez détacher le fil et utiliser promise::set_value_at_thread_exit plutôt que set_value

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


int main() 
{ 
    auto pms = std::promise<std::string>(); 
    auto ftr = pms.get_future(); 

    std::thread([&](){pms.set_value_at_thread_exit("hello world");}).detach();  
    ftr.wait(); 
    std::cout << ftr.get() << std::endl; 

    return 0; 
}