эмулировать std :: async с помощью std :: launch :: sync? - PullRequest
0 голосов
/ 22 января 2012

Я хотел бы реализовать метод, подобный этому:

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

Я знаю о boost::promise и boost::packaged_task и set_wait_callback, однако, поскольку возвращаемое будущее принимает ссылку на это, это не будетработать?

Я знаю, что есть std::async и std::launch::sync, но как можно эмулировать его, используя boost и vs2010?

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

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Вы можете использовать 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 голосов
/ 23 января 2012

Вы можете использовать код этого билета: https://svn.boost.org/trac/boost/ticket/4710

...