【问题标题】:emulate std::async with std::launch::sync?用 std::launch::sync 模拟 std::async?
【发布时间】:2012-01-21 23:08:20
【问题描述】:

我想实现一个这样的方法:

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,但是由于返回的future 引用了其中一个,所以这不起作用?

我知道有std::asyncstd::launch::sync,但是如何使用boost和vs2010来模拟呢?

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

【问题讨论】:

    标签: c++ visual-studio-2010 boost future


    【解决方案1】:

    可以使用set_wait_callback,你只需要动态分配promise,设置值后在回调中删除即可:

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

    【讨论】:

    • 一个市长问题。如果 get() 没有被调用,那么 Promise 就会被泄露。
    • 如果你使用 shared_ptr 那么你会得到一个循环依赖并且它仍然会泄漏。
    • 你是对的。最好的解决方案是修改 boost 代码来做你想做的事。
    • 我用boost::detail::future_objectreintepret_cast 技巧来创建boost::unique_future 解决了这个问题。非常丑陋,但无需修改 boost 即可工作。
    • 您能更详细地解释一下您的解决方案吗?我想我在这里遇到了类似的问题stackoverflow.com/questions/13066667/…,我真的很想看看你是如何设法调用 boost::unique_future 的隐藏 c'tor 来存储你自己的 future_object 那里的。
    【解决方案2】:

    您可以使用这张票的代码:https://svn.boost.org/trac/boost/ticket/4710

    【讨论】:

    • 虽然这只会在另一个线程上立即执行任务,但我只希望它在 get 上执行。
    猜你喜欢
    • 2012-04-01
    • 2012-07-13
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多