我使用两个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::future
? wait_for
和wait_until
不起作用,因为future
的_Running字段设置为false,因此future
的状态始终是延迟的。如何在不使用std::future
的情况下使用std::async
?
答案 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_until
和future
方法返回future_status::deferred
而不是future_status::timeout
或future_status::ready
,渲染这些方法毫无用处。