2016-01-21 650 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