gpt4 book ai didi

c++ - 等待 boost asio 的 future 在 io_service.stop() 之后永远持续

转载 作者:太空狗 更新时间:2023-10-29 20:55:29 25 4
gpt4 key购买 nike

我尝试等待从任何 boost::asio::async_ 函数返回的 std::future 对象(使用 use_future)。例如:

auto endpoint_future = resolver.async_resolve(query, boost::asio::use_future);
endpoint_future.wait(); // lasts forever after io_service.stop();

这是在一个线程中完成的。我还有另一个线程在此 async_resolve 调用之前启动:

runner_ = std::thread([this]() {
boost::asio::io_service::work work(io_service_);
io_service_.run();
});

一切正常,但后来我还添加了一个 boost::asio::deadline_timer 来停止与 io_service 的任何工作:

void deadlineTimeout() {
deadline_.cancel();
io_service_.stop();
// closing socket here does not work too
}

但是,在 deadlineTimeout() 中,当截止日期到达超时并执行 io_service_.stop() 时, future 不会被释放,因此 endpointer_future.wait () 仍然阻塞。在这种情况下,我怎样才能停止等待 future ?

最佳答案

我自己找到了一个解决方案:我们不需要 stop() io_service 而是 reset() 它,在此之前我们需要关闭套接字,因此正确的超时回调将是:

void deadlineTimeout() {
deadline_.cancel();
socket_.close(); // socket_ is a socket on io_service_
io_service_.reset();
}

此更改后,所有 future 均已发布。

关于c++ - 等待 boost asio 的 future 在 io_service.stop() 之后永远持续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com