浏览asio功能 use_future ,阅读source code。
但无法弄清楚它是如何运作的。说,如果我打电话
auto fut = async_write(sock, buffer, use_future)
fut
变为std::future
(根据源代码)。现在,如果我调用fut.get()
我应该等待异步操作完成并获得返回值。在use_future.hpp
文件中,我看到了asio async_result
处理程序解析的标准等等。
但是如果我阻止future::get()
调用,那么IO循环如何继续工作以便操作可以完成?它是否创建了系统线程?
答案 0 :(得分:3)
Asio tutorial提到,对于单线程应用程序,如果处理程序需要很长时间才能完成,则可能会发现响应能力较差。在这种情况下,如果只有一个线程正在处理io_service
,那么就会发现死锁。
使用boost::asio::use_future
时,启动操作将:
std::promise
std::future
相关联的来电者std::promise
。如果单个线程正在处理I / O服务,并且它在future::get()
上阻塞,那么将永远不会调用将设置std::promise
的完成处理程序。应用程序有责任防止这种情况发生。 official futures example通过创建一个专用于处理I / O服务的额外线程并在未处理I / O服务的线程内等待std::future
来实现此目的。
// We run the io_service off in its own thread so that it operates
// completely asynchronously with respect to the rest of the program.
boost::asio::io_service io_service;
boost::asio::io_service::work work(io_service);
std::thread thread([&io_service](){ io_service.run(); });
std::future<std::size_t> send_length =
socket.async_send_to(..., boost::asio::use_future);
// Do other things here while the send completes.
send_length.get(); // Blocks until the send is complete. Throws any errors.
答案 1 :(得分:1)
是否会创建系统线程?
没有。您假设可以自由决定运行哪个线程io_service::run