ascs 简明开发教程(二十四):单线程模式

31 篇文章 0 订阅
31 篇文章 1 订阅

社区:198941541

单线程模式指的并不是只能有一个service线程,而是一个io_context一个service线程,对于每个io_context来说,就是单线程模式,asio对单线程模式有优化,比如事件队列的增删操作省去加锁等。

单线程模式下,仍然可以运行时动态增加(但不能减少)service线程,只不过增加线程时,需要增加相同数量的io_context。

单线程模式其实就是基于多io_context支持的基础之上增加了线程数量必须等于io_context数量而已(原来是线程数量大于等于io_context数量),并外加一个优化,就是不再使用任何strand。

前面说了asio对单线程模式有优化,请记得开启这种优化,方法就是构造service_pump的时候,传入ASIO_CONCURRENCY_HINT_UNSAFE,如下:

service_pump sp(ASIO_CONCURRENCY_HINT_UNSAFE);

单线程版本,需要你显示地以sp.start_service(0);来启动,哪怕传入实际线程数量也不行,一但以0启动,单线程模式马上生效且再也改不回普通模式,以后运行时增加service线程时,必须提供相同数量的io_context,如下(新增10个service线程):

sp.add_service_thread(10, false, 10, ASIO_CONCURRENCY_HINT_UNSAFE);

那么如果不用0来启动的话,单线程版本仍然以普通版本来运行,反而影响效率,这也是为什么单线程模式分支(standalone.Asio_ST和Boost.Asio_ST,前者基于standalone asio,后者基于Boost,由于standalone asio即将不再维护,所以ascs也即将改为依赖Boost)没有合并到主分支的原因。

注意,如上所说,单线程版本的确可按普通版本运行,只是构造service_pump的时候,默认所有参数即可,然后以大于0启动,但这样反而不如普通版本效率高(只是理论上的,单线程模式下会多一些if判断)。

上一篇 ascs 简明开发教程(23)下一篇 ascs 简明开发教程(25)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值