2012-01-21 40 views
0

我想實現這樣的方法:用std :: launch :: sync模擬std :: async?

boost::unique_future<int> foo() 
{ 
    return defer([=] // call this lambda on boost::unique_future<int>::get(); 
    { 
     return prime(10); 
    }); 
} 

我知道boost::promiseboost::packaged_taskset_wait_callback,但是因爲其返回的未來需要要麼這不會工作的參考?

我知道有std::asyncstd::launch::sync,但如何使用boost和vs2010來模擬它?

std::unique_future<int> foo() 
{ 
    return std::async(std::launch::sync, [=] 
    { 
     return prime(10); 
    }); 
} 

回答

2

可以使用set_wait_callback,你只需要動態分配的承諾,並在回調中刪除:

#include <boost/thread.hpp> 
#include <iostream> 

void callback(boost::promise<int>&p) { 
    std::cout<<"callback"<<std::endl; 
    p.set_value(42); 
    delete &p; 
} 

boost::unique_future<int> f() 
{ 
    boost::promise<int> *p=new boost::promise<int>; 
    p->set_wait_callback(callback); 
    return p->get_future(); 
} 

int main() 
{ 
    boost::unique_future<int> uf(f()); 
    std::cout<<"main()"<<std::endl; 
    int val=uf.get(); 
    std::cout<<"val="<<val<<std::endl; 
} 
+0

一個市長問題。如果get()沒有被調用,那麼諾言就會泄露。 – ronag

+0

如果你使用shared_ptr 那麼你會得到一個循環依賴,它仍然會泄漏。 – ronag

+0

你是對的。最好的解決辦法是修改升壓代碼以做你想做的事。 –

相關問題