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

f.get() numaralı telefonu arayarak neden t.join() numaralı telefonu arayayım? f.get()'un sonucu elde edinceye kadar ana iş parçacığını engelleyeceğini ve bu iş parçacığının zaten bittiğini düşünürdüm.std :: future :: get kullanıyor olsam bile neden bir iş parçacığına katılmam gerekiyor?

cevap

2

İş parçacığı bittikten sonra bile hala birleştirilebilir. Bağımsız yürütmeye izin vermek için detach numaralı telefonu arayabilirsiniz.

#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

Ben parçacığı için gerekçe ya bunları açıkça ya sen misin katılmasını basitçe olduğuna inanıyorum: Bu durumda main bitirir iplik önce bu şansı azaltmak için promise arasında set_value_at_thread_exit üyesini kullanmak isteyebilirsiniz Bunları açıkça ayırın, ancak her ne olursa olsun bir thread nesnesi yok edilirse, muhtemelen tasarımınızla ilgili bir probleminiz olur. Karar, onu ayırmak istediğinizi varsaymak değildi ya da yıkıcı çağrıldığında buna katılsın, çünkü her ikisi de çoğu durumda kötü bir tahmindir. Ayrıca, vakanızla ilgili olarak, geleceğin nerede ayarlandığı önemli değildir. Konu nesnesinin gereksinimleri, geleceği nasıl tetiklediğine değinilmiyor, aynı kalıyor.

Sizin durumunuzda, artık ipliği umursamadığınız için, onu ayırabileceğinizi unutmayın.

İlgili konular