C++ 如果不使用std::async,如何使用std::future?

C++ 如果不使用std::async,如何使用std::future?,c++,c++11,boost,asynchronous,future,C++,C++11,Boost,Asynchronous,Future,我使用两个boost::进程间::消息队列进行进程间通信。一个用于发送命令,另一个用于接收答案。当我发送命令时,我正在创建一个std::promise,它将std::future对象返回给函数的调用者 std::shared_future<bool> PluginMQAdapter::exec(const std::string& exec_str) const { std::lock_guard<std::mutex> lk(mtx); prom

我使用两个
boost::进程间::消息队列
进行进程间通信。一个用于发送命令,另一个用于接收答案。当我发送命令时,我正在创建一个
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();
}

在这种情况下,我如何轮询
std::future
<代码>等待和
等待直到
不工作,因为
未来
的_运行字段设置为false,因此未来的状态总是延迟。如何使用
std::future
而不使用
std::async

找到了
boost::shared\u 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();

如果您使用的是Visual Studio 2012(问题中没有提到),那么这就是实现中的一个bug,在Visual Studio 2013中修复。引用

承诺提供的未来无用的等待功能 使用承诺提供的未来有一个显著的缺点。由于Visual Studio 2012中的一个错误,此类
future
对象的
wait_for
wait_until
方法返回了
future_status::deferred
,而不是
future_status::timeout
future_status::ready
,使得这些方法无用


std
版本也有
wait\u for
future\u status
。我有。我不明白在boost:shared_future中使用
wait_for
与在std::future中使用
wait_for
有何不同。两者都应该延迟返回,直到承诺确定为止。或者换句话说,```std::future\u status ok=result.wait\u for(std::chrono::毫秒(max\u wait\u msec));if((ok==std::future_status::ready))返回result.get();`不工作?如果它只是你正在寻找的“准备好了吗”,那么它在std::future中就不存在了。它是在C++17中添加的,但是(wait_for(0)=future_status::ready)是解决方法。如果我没记错的话,std::future只由std::async设置。std::future也由set::promise::set_值设置。这不会有什么区别,但您在这里轮询的是std::shared_future,而不是std::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();