锁竞争是服务器性能四大杀手之一(其他三个是:数据拷贝、环境切换、动态资源申请),本文将基于之前发布的kimgbo网络I/O库,以一个多线程群发聊天服务器的实现为例,介绍如何借助shared_ptr提高多线程并发的性能。
多线程群发聊天服务器实现的功能是,客户端连接服务器后,可以向服务器发送消息(消息=消息头+消息体),服务器负责将消息转发给其他正处于连接状态的客户端(包括发送消息的客户端)。示意图如下:
传统的基于Reactor模式的服务器,使用工作线程池来处理连接请求,并通过在操作之前加锁的方式来保护连接队列的数据安全。多线程对于请求队列的取出和插入操作实际上是串行的,整个服务器的并发性能较差。如果能让插入和取出处理转发任务的两个操作实现并行,则能够大大提升服务器的性能。
shared_ptr是采用引用计数方式的智能指针,如果当前只有一个观察者,则其引用计数为1,可以通过shared_ptr::unique()判断,通过s