2016-01-21 645 views
2

一旦調用std::future.get(),它將變爲無效,因爲future.valid()的調用將被確認。下面的代碼塊將失敗在運行時錯誤[克++ 4.7.0]:std :: future.get()多個呼叫(來自不同的線程)

terminate called after throwing an instance of 'std::future_error' 
    what(): No associated state 

我試圖編碼TH1TH2的依賴於TH0完成兩個等待

問題是std::future.get()不能從2個線程中調用。

我能想到的一對夫婦涉及condition_variable,或通過隊列溝通結果修復的,等

  • 什麼是最好/最有效的解決?
  • 只需使用condition_variablenotify_all()

謝謝。

template<typename R> 
class scheduler 
{ 
    public: 
    typedef R ret_type; 
    typedef std::function<R()> fun_type; 
    typedef std::promise<ret_type> prom_type; 
    typedef std::future<ret_type> fut_type; 

    // ... 

    private: 
    void init(); 
    ... 
    std::vector<prom_type> prom; 
    std::vector<fut_type> fut; 
    ... 

    }; 


template<typename R> 
scheduler<R>::init() 
{ 
    // ... 

    // set fut[i] = prom[i].get_future(), for each i 

    fun_type f0 = myFun0; 
    fun_type f1 = myFun1; 
    fun_type f2 = myFun2; 

    std::thread th0([this](fun_type f) 
       { 
        prom[0].set_value(f0()); 
       },f0) 

    std:thread th1([this](fun_type f, R fut_val) 
       { 
        prom[1].set_value(f1()); 
       },f1,fut[0].get()); 
    std::thread th2([this](fun_type f, R fut_val) 
       { 
        prom[2].set_value(f2()); 
       },f2,fut[0].get()); 

    // Join on threads : th0.join(), etc. 
    } 
+3

'std :: shared_future'? – cpplearner

+0

呃是的,這似乎是我想要的。我會嘗試... –

回答

4

您應該考慮爲此使用shared_future

類模板std :: shared_future提供了一種機制來訪問異步操作的結果,類似於std :: future,除了允許多個線程等待相同的共享狀態....訪問如果每個線程都通過自己的shared_future對象副本執行,則來自多個線程的共享狀態是安全的。

+0

YUP,只是工作 - 對我的typedef單行更改。我忽略了這一點 - 謝謝! –

+0

不客氣。祝你好運! –

+1

@charles no。每個線程都必須具有相同共享狀態的自己的shared_future副本:OP中的上述代碼與將來替換爲共享未來的代碼無效 – Yakk