2012-01-21 39 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

你是对的。最好的解决办法是修改升压代码以做你想做的事。 –

相关问题