社区: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)