我以取消操作时发生超时,用std::future
与boost::asio::async_connect
的建议在这里:https://stackoverflow.com/a/30428941与超时升压等待:: ASIO :: async_connect失败(STD ::未来:: wait_for)
但是,std::future::wait_for()
立即返回std::future_status::deferred
,即操作尚未开始。后面的conn_result.get()
会阻塞,直到因为远程主机未在侦听而导致连接错误。我不想依赖它,因为它可能会持续很长时间,直到出现套接字错误。
如何在boost :: asio创建的期货上正确等待?
编辑:SSCCE
#include <iostream>
#include <future>
#include <thread>
#include <boost/asio.hpp>
#include <boost/asio/use_future.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[]) {
boost::asio::io_service ioservice;
boost::asio::io_service::work work(ioservice);
std::thread t([&](){ioservice.run();});
tcp::resolver resolver(ioservice);
tcp::resolver::query query("127.0.0.1","27015"); // random unused adress
tcp::socket socket(ioservice);
std::future<tcp::resolver::iterator> conn_result = boost::asio::async_connect(socket,resolver.resolve(query),boost::asio::use_future);
std::cout << "IO Service running: " << (!ioservice.stopped() ? "y":"n") << std::endl;
auto status = conn_result.wait_for(std::chrono::milliseconds(500));
if (status == std::future_status::timeout) {
socket.cancel();
std::cout << "Timeout" << std::endl;
return 0;
} else if(status == std::future_status::deferred) {
std::cout << "Deferred" << std::endl;
}
// If the operation failed, then conn_result.get() will throw a
// boost::system::system_error.
try {
conn_result.get();
} catch(const boost::system::system_error& e) {
std::cerr << e.what() << std::endl;
}
ioservice.stop();
t.join();
return 0;
}
- 编译:MSVC2012
- 升压1.58
请发表SSCCE – sehe
'的std :: future_status :: deferred'并不意味着任务还没有开始,就意味着它不是直到你明确地调用'get()'或'wait()',然后它会在当前线程上同步运行。如果任务应该异步运行(async_connect建议),那么Asio应该使用std :: launch :: async策略调用std :: async()来防止延迟。 –
@sehe好点,编辑。 – TheBender