Boost.Asio了解io_context工作原理

Boost.Asio可用于对I / O对象(例如套接字)执行同步和异步操作。

I/O模型

io_context对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。在同步事件中会使用一个默认的

asio::io_context io_context;
asio::ip::tcp::socket socket(io_context)

同步IO主要执行流程

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061722140181.png)
  1. 您的程序将至少有一个io_context对象。 io_context表示程序到操作系统的I / O服务的链接。

boost::asio::io_context io_context;

  1. 要执行I / O操作,您的程序将需要一个I / O对象,例如TCP套接字

boost::asio::ip::tcp::socket socket(io_context);

当执行同步连接操作时,将发生以下事件序列
  1. 您的程序通过调用I / O对象来启动连接操作

socket.connect(server_endpoint);

  1. I / O对象将请求转发到io_context。
  2. io上下文调用操作系统来执行连接操作。
  3. 操作系统将操作的结果返回给io上下文。
  4. io_context将由操作导致的任何错误转换为boost :: system :: error_code类型的对象,传给IO对象
  5. 如果操作失败,则I / O对象将引发类型boost :: system :: system_error的异常。

boost::system::error_code ec;
socket.connect(server_endpoint, ec);

异步IO主要执行流程

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200617221843793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTcyNjMx,size_16,color_FFFFFF,t_70)
  1. 您的程序通过调用I / O对象来启动连接操作

socket.async_connect(server_endpoint, your_completion_handler);

其中 your_completion_handler为一个回调函数

  1. I / O对象将请求转发到io_context。
  2. io上下文向操作系统发出应该启动异步连接的信号
    在这里插入图片描述
  3. 操作系统通过将结果放在一个队列上来指示连接操作已经完成,等待io上下文拾取。
  4. 您的程序必须调用io context::run()(或一个类似的io context成员函数),以便检索结果。当有未完成的异步操作时,对io context::run()的调用会阻塞,所以通常会在开始第一个异步操作时调用它。
  5. 在对io上下文::run()的调用中,io上下文将操作的结果取出队列,将其转换为错误代码,然后将其传递给完成处理程序(回调函数)
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值