2016-12-16 82 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; 
} 

根據this link,std::future::wait阻塞,直到結果變得可用。
爲什麼沒有未來::等待()塊

但是,上面的代碼不能打印任何東西。顯然主線程在完成pms.set_value的線程之前已經完成。

爲什麼ftr.wait()阻止?

+0

我建議你看一看的std ::異步 – LeDYoM

回答

9

問題不在於std::future::wait不阻止。真正的問題是,你在產生的線程,做它的工作以及破壞主線程中的std::thread(臨時)對象之間存在競爭條件。

因此,如果線程仍可連接,則在std::thread的析構函數中調用abort

工作代碼:

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

注意,如果你不加入thread明確,你仍然有相同的競爭條件(因爲它可能是main可以做它的工作速度更快,比thread能自身清潔起來

演示工作實例:。here

+3

Upvoted不建議拆卸螺紋。 –

0

或者您可以分離線程,並使用promise::set_value_at_thread_exit而不是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; 
}