asio :: use_future和事件循环

时间:2016-02-29 21:33:11

标签: c++ boost stl boost-asio

浏览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循环如何继续工作以便操作可以完成?它是否创建了系统线程?

2 个答案:

答案 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