最近想自己写一个基于boost asio的游戏服务器,看了很多开源项目的代码,最后采用了多线程,多io_service的架构,代码完成了90%了,越写感觉要面临的问题还是蛮多的,应该就是多线程带来的种种困扰。
当然,这些困扰都来自于整个系统架构:一个io_service对应一个线程,一个线程管理多个session,这样一来,和单个io_service,单线程的架构是一样的,可以减少很多锁操作,而简单的通信,session可以完全不用顾虑去竞争io_service,所以代码里几乎没有用strand。
这种写法首先要解决的就是跨io_service的消息处理,比如session A想要发送消息到session B,两个session分别由两个线程Thread A ,Thread B处理,这个问题比较好解决,通过主线程维护session列表和thread列表,发送消息的时候找到对应session的thread,对其io_service post一个消息就可以了。
新的问题是考虑到逻辑处理,在读写共享资源的时候,势必要加锁来处理,而且还要保证消息处理的先后顺序,如果用单独的线程来处理,就要让多个net io线程来写逻辑线程的消息队列,这样也会让瓶颈回到单线程处理上。