当前位置: 首页 > 编程日记 > 正文

Boost::asio io_service 实现分析

io_service的作用

io_servie 实现了一个任务队列,这里的任务就是void(void)的函数。Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。

Io_servie的接口

提供的接口有run、run_one、poll、poll_one、stop、reset、dispatch、post,最常用的是run、post、stop

Io_servie 实现代码的基本类结构:

l  Io_servie是接口类,为实现跨平台,采用了策略模式,所有接口均有impl_type实现。根据平台不同impl_type分为

n  win_iocp_io_service Win版本的实现,这里主要分析Linux版本。

n  task_io_service 非win平台下的实现,其代码结构为:

u  detail/task_io_service_fwd.hpp 简单声明task_io_service名称

u  detail/task_io_service.hpp 声明task_io_service的方法和属性

u  detail/impl/task_io_service.ipp 具体实现文件

u  队列中的任务类型为opertioan,原型其实是typedef task_io_service_operation operation,其实现文件在detail/task_io_service_operation.hpp中,当队列中的任务被执行时,就是task_io_service_operation:: complete被调用的时候。

Io_servie::Post方法的实现

Post向队列中投递任务,然后激活空闲线程执行任务。其实现流程如下:

l  Post接收handler作为参数,实际上是个仿函数,通过此仿函数构造出completion_handler对象,completion_handler继承自operation。然后调用post_immediate_completion。

l  post_immediate_completion首先将outstanding_work_增加,然后调用post_deferred_completion。

l  post_deferred_completion首先加锁将任务入列,然后调用wake_one_thread_and_unlock

l  wake_one_thread_and_unlock尝试唤醒当前空闲的线程,其实现中特别之处在于,若没有空闲线程,但是有线程在执行task->run,即阻塞在epoll_wait上,那么先中断epoll_wait执行任务队列完成后再执行epoll_wait。

l  first_idle_thread_维护了所有当前空闲线程,实际上使用了Leader/Follower模式,每次唤醒时只唤醒空闲线程的第一个。

Io_servie::run方法的实现

Run方法执行队列中的所有任务,直到任务执行完毕。

l  run方法首先构造一个idle_thread_info,和first_idle_thread_类型相同,即通过first_idle_thread_将所有线程串联起来,它这个串联不是立即串联的,当该线程无任务可做是加入到first_idle_thread_的首部,有任务执行时,从first_idle_thread_中断开。这很正常,因为first_idle_thread_维护的是当前空闲线程。

l  加锁,循环执行do_one方法,直到do_one返回false

l  do_one每次执行一个任务。首先检查队列是否为空,若空将此线程追加到first_idle_thread_的首部,然后阻塞在条件变量上,直到被唤醒。

l  当被唤醒或是首次执行,若stopped_为true(即此时stop方法被调用了),返回0

l  队列非空,pop出一个任务,检查队列无任务那么简单的解锁,若仍有,调用wake_one_thread_and_unlock尝试唤醒其他空闲线程执行。然后执行该任务,返回1.

l  实际上在执行队列任务时有一个特别的判断if (o == &task_operation_),那么将会执行task_->run,task_变量类型为reactor,在linux平台实现为epoll_reactor,实现代码文件为detail/impl/epoll_reactor.ipp,run方法实际上执行的是epoll_wait,run阻塞在epoll_wait上等待事件到来,并且处理完事件后将需要回调的函数push到io_servie的任务队列中,虽然epoll_wait是阻塞的,但是它提供了interrupt函数,该interrupt是如何实现的呢,它向epoll_wait添加一个文件描述符,该文件描述符中有8个字节可读,这个文件描述符是专用于中断epoll_wait的,他被封装到select_interrupter中,select_interrupter实际上实现是eventfd_select_interrupter,在构造的时候通过pipe系统调用创建两个文件描述符,然后预先通过write_fd写8个字节,这8个字节一直保留。在添加到epoll_wait中采用EPOLLET水平触发,这样,只要select_interrupter的读文件描述符添加到epoll_wait中,立即中断epoll_wait。很是巧妙。!!!实际上就是因为有了这个reactor,它才叫io_servie,否则就是一个纯的任务队列了。

l  Run方法的原则是:

n  有任务立即执行任务,尽量使所有的线程一起执行任务

n  若没有任务,阻塞在epoll_wait上等待io事件

n  若有新任务到来,并且没有空闲线程,那么先中断epoll_wait,先执行任务

n  若队列中有任务,并且也需要epoll_wait监听事件,那么非阻塞调用epoll_wait(timeout字段设置为0),待任务执行完毕在阻塞在epoll_wait上。

n  几乎对线程的使用上达到了极致。

n  从这个函数中可以知道,在使用ASIO时,io_servie应该尽量多,这样可以使其epoll_wait占用的时间片最多,这样可以最大限度的响应IO事件,降低响应时延。但是每个io_servie::run占用一个线程,所以io_servie最佳应该和CPU的核数相同。

Io_servie::stop的实现

l  加锁,调用stop_all_threads

l  设置stopped_变量为true,遍历所有的空闲线程,依次唤醒

l  task_interrupted_设置为true,调用task_的interrupt方法

l  task_的类型为reactor,在run方法中已经做了分析

相关文章:

叮!你有一份2018英特尔人工智能大会的邀请函,请查收!

AI赋能的数字化应用,作为时代发展的核心驱动力,已经成为改变各行各业的神奇力量。想要准确把握智能时代的发展航向,领航舵手英特尔已向你发出邀请:2018英特尔人工智能大会,欢迎你的到来!11月14日-15日&…

赢得高薪的锦囊三秘诀

作者:jingch 来源:南京竞成 时间:2007-6-27 10:58:40 秘诀一 获得高薪的必备素质通过对一些高收入的外企白领阶层的调查发现,高学历并不与高收入划等号,高薪收入者的基本素质上的优势才是他们获得高薪的关键。概括起…

可疑文件_【国家标准】印刷文件鉴定技术规范点阵式打印文件的同机鉴定

印刷文件鉴定技术规范(GB/T 37232-2018)总则印刷文件同机(同版)鉴定的受理程序、送检材料的标识、检验鉴定程序、送检材料的流转程序及结果报告程序应按GB/T 37234-2018第4章~第8章中相应的要求。印刷文件同机鉴定分为传统制版文件同机鉴定和办公设备机制文件同机鉴定。其中,办…

前端开发神器之ngrok

ngrok能做什么,为什么是前端开发神器? 内网穿透,映射本地开发环境到公网,模拟多终端线上环境。 结合一个很简单的PWA demo,举个简单的例子 1.克隆demo到本地 git clone https://github.com/minimal-xyz/minimal-pwa.gi…

YC陆奇发起知乎第一问:怎样的环境才能让更多AI创业公司成功?

“在人工智能时代,怎样的创新环境和措施能让更多科技驱动的创业公司成功,使其不再是大型科技公司的专利?” 一周前,知乎发起了“2018 互联网洞见者”提问,先后邀请到鹅厂厂长马化腾、“风投女王”徐新、香港科技大学杨…

Linq to SQL 资源

Scott Guthrie 的 Linq to SQL 系列:1)介绍http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx 2)定义数据模型http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx 3)查询…

首发|机器学习未来十年:你需要把握的趋势和热点

CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版即将重磅面世! V1.0 版发布以来,我们有幸得到了诸多读者朋友及行业专家的鼎力支持,在此表示由衷感谢。此次 V2.0 版路线图将进行新一轮大升级,力求为读者呈现更全面的中国…

web前端知识点太多_初学web前端,学习方法容易走偏,这是为什么?

一、了解web前端所谓“知己知彼,百战不殆”,在学习web前端之前,还是让我们先了解一下什么是web前端吧!所有用户终端产品与视觉和交互有关的部分,都属于前端开发的领域。从狭义上讲,Web前端就是用HTML、CSS、…

2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest

A. Automatic Door 对于规律的点可以推公式计算&#xff0c;对于噪点则暴力计算&#xff0c;时间复杂度$O(m\log m)$。 #include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<ctype.h> #include<math.h> #…

正则过滤非法字符

小写英文&#xff1a;大写英文&#xff1a;任意数字&#xff1a;限2位小数&#xff1a; 如: 123.12日  期&#xff1a; 如: 2002-9-29任意中文&#xff1a;部分英文&#xff1a; 范围: a,b,c,d,e部分中文&#xff1a; 范围: 一二三四五六七八九十有关正则表达式 ?.只能输入数…

emoji 乱码_这个自制emoji的网站,让你成为永远不输的斗图王者

作为表情界的元老级人物&#xff0c;不管是苹果官网输入法、微信官方表情还是各个主流输入法里&#xff0c;我们都可以从里面找到大量 emoji 表情。然鹅……就算这么多表情&#xff0c;小帮每次发 emoji 时还有有些选择困难。因为翻遍所有表情&#xff0c;都没法找到合适的啊&a…

[vijos1234]口袋的天空最小生成树

题目链接&#xff1a;https://vijos.org/p/1234 白天刚刚写完prim的算法&#xff0c;晚上就心血来潮的打了一道最小生成树的题 虽然有题解说可以用prim做&#xff0c;但是这道题明显是加最小的边&#xff0c;感觉kruskal方便多了 但是愉快的是我竟然不是一次过&#xff0c;最后…

南开大学提出最新边缘检测与图像分割算法,精度刷新记录(附开源地址)

作者 | 刘云、程明明、胡晓伟、边佳旺等 译者 | 刘畅 整理 | Jane 出品 | AI科技大本营 近日&#xff0c;南开大学媒体计算实验室提出的最新边缘检测和图像过分割&#xff08;可用于生成超像素&#xff09;被 IEEE PAMI 录用。研究的第一作者也发微博称&#xff1a;“这是第…

修改Vista系统目录权限

例如C:\Windows\System32\DriverStore\FileRepository1. 修改目录所有者右键菜单->Properties->Security->Advanced->Owner->Edit->Other users or groups...输入用户名并确定&#xff0c;勾选Replace owner on subcontainers and objects&#xff0c;一路确…

gitlab安装各种坑

架构&#xff1a;源码安装, 数据库用mysql,网站用nginx 坑一.nginx报错 122016/07/19 09:26:11 [crit] 3881#0: *10 connect() to unix:/home/git/gitlab/tmp/sockets/gitlab-workhorse.socket failed (13: Permission denied) while connecting to upstream, client: 192.168.…

当代的设计潮流是什么_解码“潮流合伙人”IP生意经

每经记者&#xff1a;杜蔚 每经编辑&#xff1a;董兴生11月18日&#xff0c;备受期待的《潮流合伙人2》在成都举办了FOURTRY FAMILY PARTY新品发布日活动&#xff0c;节目的品牌主理人陈伟霆&#xff0c;合伙人欧阳娜娜、范丞丞等纷纷亮相现场&#xff0c;吸引众多人前来围观。…

Loonframwork到SWT的移植测试(JAVA GAME TEST SOURCE)

愚以为&#xff0c;用SWT作界面&#xff0c;是一种在用Java写VB的体验。本周心情极度恶劣&#xff0c;一直不想说话&#xff0c;也不想写新代码&#xff0c;郁闷中尝试了一下将Loonframework的代码移植到SWT。&#xff08;其实我觉得AWT,SWT,Swing用那个真的要根据需求决定&…

百度大脑发挥AI“头雁效应” 王海峰:在AI时代共同推动社会智能化升级

11月1日&#xff0c;百度大脑作为2018百度世界大会的第一弹登场。 近期国家层面也高度重视人工智能的发展现状和趋势&#xff0c;认为加快发展新一代人工智能是事关我国能否抓住新一轮科技革命和产业变革机遇的战略问题。人工智能技术具有溢出带动性很强的“头雁”效应。百度高…

bat脚本如何自动输入y_Linux系统如何设置开机自动运行脚本?

大家好&#xff0c;我是良许。 在工作中&#xff0c;我们经常有个需求&#xff0c;那就是在系统启动之后&#xff0c;自动启动某个脚本或服务。在 Windows 下&#xff0c;我们有很多方法可以设置开机启动&#xff0c;但在 Linux 系统下我们需要如何操作呢&#xff1f; Linux 下…

form表单的action提交写到js中来,同时onclick事件也写在js中来。其action也可以通过ajax来提交的。...

假如你现在还在为自己的技术担忧&#xff0c;假如你现在想提升自己的工资&#xff0c;假如你想在职场上获得更多的话语权&#xff0c;假如你想顺利的度过35岁这个魔咒&#xff0c;假如你想体验BAT的工作环境&#xff0c;那么现在请我们一起开启提升技术之旅吧&#xff0c;详情请…

Win32.Lioten.SG病毒

病毒名称&#xff1a;Win32.Lioten.SG 疯狂性&#xff1a;低 破坏性&#xff1a;中 普及度&#xff1a;中 Win32.Lioten.SG病毒描述&#xff1a; Win32.Lioten.SG是一种通过网络共享传播的蠕虫&#xff0c;还会利用Windows漏洞进行传播&#xff0c;并利用IRC控制后门。 Lioten经…

2019秋招AI岗位竞争究竟有多激烈?

机器学习未来十年&#xff1a;你需要把握的趋势和热点一个正经的机器学习项目&#xff1a;关于那些羞羞的不可描述的动作分析【面试现场】如何编程获得最多的年终红包奖&#xff1f;你最关心的马蜂窝事件舆论全景图在这里&#xff0c;用文本挖掘一挖到底影响 5000 万开发者&…

配置Tomcat和在Eclipse中创建Web工程

配置Tomcat服务器信息&#xff1a;在Tomcat的安装目录下有一个conf目录&#xff0c;里面存放着Tomcat服务器的配置文件&#xff0c;其中最为核心的配置文件是server.xml&#xff0c;在这个文件里我们可以配置服务器的各种参数&#xff0c;例如超时时间、连接数量、端口配置等等…

eureka需要替换吗_iOS第三方库Eureka实现定制动画详解(二):万变不离其宗-Row组件...

Eureka的核心就是Row&#xff0c;所以我们得重点聊聊它。Row是什么&#xff1f;其实上面已经说过了&#xff0c;不过这只是干巴巴的概念&#xff0c;下面本猫用一个实际的例子带大家性感&#xff0c;哦&#xff0c;不…是感性的认识一下到底什么是Row 新建一个iOS项目&#xff…

学习这么多算法到底在解决哪些问题?深度学习之外,我们要选择谁?

CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版即将重磅面世&#xff01; V1.0 版发布以来&#xff0c;我们有幸得到了诸多读者朋友及行业专家的鼎力支持&#xff0c;在此表示由衷感谢。此次 V2.0 版路线图将进行新一轮大升级&#xff0c;力求为读者呈现更全面的中国…

JDK6.0+Eclipse3.2+MyEclipse5.0GA+Tomcat5.0+Win2003搭建J2EE开发平台.

呼.........不容易啊.J2EE平台今天终于搭建起来了.... 1.先安装jdk-6-beta2-windows-i586.exe,安装目录:E:\Program Files\Java\jdk1.6.0 2.然后安装jakarta-tomcat-5.0.30服务器.安装目录:E:\Program Files\Java\Tomcat 5.0 3.在"我的电脑"--"属性"--&quo…

Google全球员工围攻Google!

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑屋漏偏逢连夜雨&#xff0c;仍未进得了中国的搜索巨人 Google&#xff0c;在自己的地盘上&#xff0c;日子也不好过。自 2005 年收购以来&#xff0c;硅谷科技巨头 Google 在世界上第一大手机操作系统 Android 收益颇丰&#x…

23 版本以上的v4包_Ant Design Pro V2升级到V4 小结

前言前不久接手过一个历史悠久的项(shi)目(shan)&#xff0c;技术栈之复杂(混乱)令我潸然泪下&#xff1a;你甚至可以在一个项目里使用前端三大框架(Angular1, Vue, React)。三份的代码&#xff0c;本应该给我带来更多的快乐&#xff0c;但是为什么会变成这样呢?鉴于接到的是一…

python标准库介绍——23 UserString 模块详解

UserString 模块(2.0 新增) UserString 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的封装, 后者是一个变种, 允许你修改特定位置的字符(联想下列表就知道了).注意 //MutableString// 并不是效率很好, 许多操作是通过切片和字符串连接实现…

影像融合操作的几种途径

影像融合操作的几种途径 1、在遥感软件中作影像融合 融合必须在全色波段和多光谱波段两者配准好的基础上进行&#xff0c;我建议你用edars融合&#xff0c;这样比较省时。据说PCI最好&#xff0c;机器没有软件没有试验。 在envi中&#xff0c;把全色波段和多光谱波段两个图像…