为什么io_service可以在没有run()的情况下用于同步操作

时间:2015-04-20 12:46:40

标签: c++ boost boost-asio

我很感兴趣为什么我可以在没有run()调用同步套接字操作的情况下使用boost :: asio :: io_service?例如,以下代码段有效:

boost::asio::io_service io_service;
tcp::acceptor a_event_data(io_service, tcp::endpoint(tcp::v4(), port + 2));
// Accept a connection to event socket
socket_ptr sock_event_data(new tcp::socket(io_service));
a_event_data.accept(*sock_event_data);

boost::asio::ip::tcp::endpoint endpoint_event_data = sock_event_data->remote_endpoint();
std::cout << "Accepted a connection for Event Data socket from " << endpoint_event_data.address().to_string() << std::endl;

但是没有调用run()。在异步连接的情况下,我必须使用它。这是io_service的虚拟用法,只是为了与系统接口吗?

2 个答案:

答案 0 :(得分:0)

同步操作在当前线程上执行I / O操作。异步操作在io_service的线程池中的一个线程上执行I / O操作。如果你不至少调用run()一次(当有实际工作要做时;否则会立即返回),池中没有线程。

答案 1 :(得分:0)

对 I/O 对象的同步操作隐式运行 io_service 对象以进行单个操作。

io_service 必须调用 io_service 函数 run()、run_one()、poll() 或 poll_one() 才能代表 C++ 程序执行异步操作。

异步操作已完成的通知是通过调用关联的处理程序来传递的。处理程序仅由当前为 io_service 调用任何 run()、run_one()、poll() 或 poll_one() 重载的线程调用。