如何在不使用std :: async的情况下使用std :: future?

时间:2014-05-27 10:09:10

标签: c++ c++11 boost asynchronous future

我使用两个boost::interprocess::message_queue进行进程间通信。一个用于发送命令,另一个用于接收答案。当我发送命令时,我创建了一个std::promise,它将std::future对象返回给我的函数调用者

std::shared_future<bool> PluginMQAdapter::exec(const std::string& exec_str) const
{
    std::lock_guard<std::mutex> lk(mtx);
    promise_queue.push(std::make_shared<std::promise<bool> >());
    need_exec_queue.push(exec_str);

    return promise_queue.back()->get_future();
}

收到结果后

int number = 0;
if(recv_mq->try_receive(&number, sizeof(number), recvd_size, priority) && !promise_queue.empty())
{
    promise_queue.front()->set_value(number != 0);
    promise_queue.pop();
}

在这种情况下如何轮询std::futurewait_forwait_until不起作用,因为future的_Running字段设置为false,因此future的状态始终是延迟的。如何在不使用std::future的情况下使用std::async

2 个答案:

答案 0 :(得分:0)

找到boost::shared_future

的解决方法
auto result = exec(exec_str);
const unsigned int wait_msec = 10, max_wait_msec = 5000;
unsigned int i = 0;
while(!result.is_ready() && i < max_wait_msec)
{
    std::this_thread::sleep_for(std::chrono::milliseconds(wait_msec));
    i += wait_msec;
}
if(result.is_ready())
    return result.get();

使标准成为问题是什么?!

更短的版本也适用

boost::future_status ok = result.wait_for(boost::chrono::milliseconds(max_wait_msec));
if((ok == boost::future_status::ready))
    return result.get();

答案 1 :(得分:0)

如果您使用的是Visual Studio 2012(问题中没有提到),那么这实际上是Visual Studio 2013中修复的实现中的错误。引自http://cpprocks.com/44-c11-bugs-fixed-in-visual-studio-2013/

  

将来无用的等待函数由promise

提供      

使用承诺提供的未来存在重大缺点。由于Visual Studio 2012中存在错误,此类wait_for对象的wait_untilfuture方法返回future_status::deferred而不是future_status::timeoutfuture_status::ready,渲染这些方法毫无用处。