【问题标题】:What is asio::io_service?什么是 asio::io_service?
【发布时间】:2020-12-25 02:41:07
【问题描述】:

我正在研究异步 I/O。我知道 select()、poll() 和 epoll()。 我很好奇的是使用 boost::asio 时的异步 I/O。作为调查的结果,使用了io_service。 select()、poll() 和 epoll 中的哪一个?

【问题讨论】:

    标签: c++ select epoll asio


    【解决方案1】:

    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 的某个版本,以便在线程池中的线程上高效地分配任务。

    【讨论】:

    • 你在 io_context 中使用 epoll() 吗?
    • 我不确定实现细节,但我希望它使用平台可用的套接字 io 通知系统 - 例如。 linux 上的 epoll,osx 上的 kqueue 和 win 上的完成端口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2013-06-13
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多