【问题标题】:What exacty is io_context?io_context 到底是什么?
【发布时间】:2020-04-02 17:53:12
【问题描述】:

我一直在浏览 boost asio 库,其中大多数对象都需要 io_context 对象作为构造函数的参数。我已经阅读了什么 io_context 对象,根据文档说明它是

io_context 类为异步 I/O 对象的用户提供核心 I/O 功能

这让我很困惑,因为这不是 iostream 所做的。我真的很确定我遗漏了一些东西,请帮我澄清一下,我也看不出 之间有什么区别>I/O 对象sockets 不同的是,sockets 可用于在两个设备之间交换数据,而 I/O 对象使我们能够与我们的计算机交换数据。我是在这一点上真的很困惑!

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    io_context 包含运行基于selectepoll 或其他特定于平台的调用和调度事件(例如套接字就绪、计时器、信号、空闲)的事件循环所需的状态,以回调用户已注册。不同套接字、计时器等的许多回调可以用一个io_context 注册。 io_context 不执行 I/O,但当 I/O 可以以非阻塞方式完成时,它会调用这些回调,例如数据已到达,套接字已准备好读取,回调执行实际的非阻塞 I/O。

    更多详情请见Basic Boost.Asio Anatomy

    其他流行的事件循环是libeventlibuv

    The C10K problem 很老,但对异步 I/O 的主题很有启发性。


    C++20 coroutines 引入了一种新的编程模型,它的优点是更易于编写和读取,并且可以缓解非阻塞 I/O 代码中固有的回调地狱Boost.Asio supports coroutines.

    【讨论】:

    • 每个进程可以只有1个io_context吗?一个进程中是否可以有多个线程并且每个线程都运行一个 io_context ?
    • @MaximEgorushkin 对不起,我已经仔细阅读了链接到的文档,但我仍然不太确定。根据该文件,该文件说:“一般来说,同时使用不同的对象是安全的。”因此,似乎单个进程中可能有多个 io_context 。更多内容在下一条评论中。
    • @MaximEgorushkin 在我阅读了另一份文件后,我再次感到困惑。根据这个document,它说:程序必须确保流不执行其他写入操作(例如 async_write、流的 async_write_some 函数或任何其他执行写入的组合操作),直到此操作完成。好像不能同时调用两个 boost::ansy_write ,所以在一个进程中有多个 io_context 似乎没用。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2013-05-05
    • 2010-11-19
    • 2012-06-16
    • 2011-04-02
    • 2016-04-13
    • 2012-03-07
    • 2013-08-14
    相关资源
    最近更新 更多