IO模型
io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。
asio::io_service io_service;
asio::ip::tcp::socket socket(io_service);
io_servuce的作用: io_servie 实现了一个任务队列,这里的任务就是void(void)的函数。
Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。
Io_service是完全线程安全的队列。
同步的io主要流程
、应用程序调用IO对象成员函数执行IO操作
、IO对象向io_service 提出请求.
、io_service 调用操作系统的功能执行连接操作.
、操作系统向io_service 返回执行结果.
、io_service将错误的操作结果翻译为boost::system::error_code类型,再传递给IO对象.
、如果操作失败,IO对象抛出boost::system::system_error类型的异常.
异步IO的处理流程
、应用程序调用IO对象成员函数执行IO操作
、IO对象请求io_service的服务
、io_service 通知操作系统其需要开始一个异步连接.
、操作系统指示连接操作完成, io_service从队列中获取操作结果
、应用程序必须调用io_service::run()以便于接收结果
、调用io_service::run()后,io_service返回一个操作结果,并将其翻译为error_code,传递到事件回调函数中
io_service对象提供的接口有run、run_one、poll、poll_one、stop、reset、dispatch、post,最常用的是run、post、stop:
post用于发布io事件,
如timer,socket读写等,一般由asio框架相应对象调用,无需我们显式调用。
run用于监听io事件响应,并执行响应回调,
对于异步io操作需要在代码中显式调用,
对于同步io操作则由io对象隐式调用(并不是run函数,不过也是等待io事件)。
io_service提供的是一个生产者消费者模型。在异步io操作中需要我们手动控制消费者,调用run函数,它的基本工作模式如下:
、等待io事件响应,如果所有io事件响应完成则退出
、等待到io事件响应后,执行其对应的回调
、继续等待下一个io事件,重复1-
run函数在io事件完成后会退出,导致后续基于该对象的异步io任务无法执行
由于io_service并不会主动调度线程,需要我们手动分配,常见的方式是给其分配一个线程,然后执行run函数。
但run函数在io事件完成后会退出,线程会终止,后续基于该对象的异步io任务无法得到调度。
解决这个问题的方法是通过一个asio::io_service::work对象来守护io_service。
这样,即使所有io任务都执行完成,也不会退出,继续等待新的io任务。
boost::asio::io_service::work work(io_service);
io_service.run();

最新文章

  1. Sql server2012 常见异常处理
  2. jQuery验证控件jquery.validate.js使用说明
  3. PDO连接数据库
  4. 数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)
  5. Java实现带括号优先级的计算器
  6. linux 冒号的用途
  7. FtpWebRequest FTP异步下载、异步上传文件
  8. Linux应用总结:自动删除n天前日志
  9. 创建本地CM 离线服务器
  10. 使用GDB调试Android NDK native(C/C++)程序
  11. 回溯算法之n皇后问题
  12. FOR XML PATH 转换问题
  13. nutch2.2.1
  14. 八 Appium常用方法介绍
  15. 基于 HTML5 WebGL 的 3D 网络拓扑图
  16. 23个适合Java开发者的大数据工具和框架
  17. iOS中 GCD-Grand Central Dispath 多线程 UI_21
  18. Kong(V1.0.2)loadbalancing
  19. Android使用scrollview截取整个的屏幕并分享微信
  20. weblogic发序列化命令执行漏洞工具分享

热门文章

  1. 纯css耍个透明正方体转一转
  2. php判断访问协议是否是https
  3. 模板引擎Velocity学习系列-#set指令
  4. Junit测试Service类方法教程
  5. jvm对象内存分配
  6. Two progressions CodeForce 125D 思维题
  7. linux mysql中文乱码解决
  8. cmd控制台 wrapper | OpenSCManager failed - 拒绝访问。 (0x5)解决
  9. 创建FTP访问的YUM源
  10. SpringBootSecurity学习(14)前后端分离版之 OAuth2.0介绍