【发布时间】:2020-12-25 02:41:07
【问题描述】:
我正在研究异步 I/O。我知道 select()、poll() 和 epoll()。 我很好奇的是使用 boost::asio 时的异步 I/O。作为调查的结果,使用了io_service。 select()、poll() 和 epoll 中的哪一个?
【问题讨论】:
我正在研究异步 I/O。我知道 select()、poll() 和 epoll()。 我很好奇的是使用 boost::asio 时的异步 I/O。作为调查的结果,使用了io_service。 select()、poll() 和 epoll 中的哪一个?
【问题讨论】:
asio::io_service 已过时。
在较新的 boost 版本中,它被 asio::io_context 取代。
io_context (formly io_service) 主要目的是对 asio 库中的对象执行异步操作,例如。 socket、acceptor等,根据documentation:
...I/O 对象上的同步操作隐式运行 io_context 单个操作的对象。 io_context 函数 run(), 必须调用 run_one()、run_for()、run_until()、poll() 或 poll_one() 让 io_context 代表 a 执行异步操作 C++ 程序。异步操作已完成的通知 通过调用关联的处理程序来传递。处理程序是 仅由当前调用任何重载的线程调用 run()、run_one()、run_for()、run_until()、poll() 或 poll_one() io_context....
基本上,您将要执行的任务发送到 io_context(async_... 函数),io_context 负责执行这些任务(可能在线程或线程池上)并调用提供的回调(=handler)。
它通常在内部使用task-stealing 的某个版本,以便在线程池中的线程上高效地分配任务。
【讨论】: