多线程高并发无锁内存池队列模型
鲁峰 写于:201703024
转载请注明出处,写一篇原著不容易。有问题欢迎交流。
做大并发服务时,无锁队列显得格外重要。本文介绍一种常见的多线程无锁队列模型。
有图见真相
模式介绍:
1 采集来的数据存队列的过程
本模型的网络通讯层是基于类似与完成端口模型,收数据线程,是2*cpu+2个,多个线程把接收到的信息存放到一个队列中(m_oBlockItemQueue)中,
2 单线程切分片,供下一步,单线程取属于自己线程负责的块用
然后由workthread单线程只负责切片,其他活都不干, 将m_oBlockItemQueue数据按用户的id切分成n个内存块m_oThreadContext[n]
3 启动n个线程,每个线程只负责自己线程负责的内存块的读取和回收
为了让数据处理线程拿到数据,需要启动n个,从m_oThreadContext中取数据的线程,取出数据后交给执行函数进行处理,执行函数处理的时候也可以参考类似的队列结构减少锁等待。注意的地方是,虽然整体上也是多线程读内存池,但是每个线程只负责一个属于自己管理的内存,所以对于每一片的内存,读和写的都是一个单线程,这样就可以避免加锁带来的效率问题。
结论
目前高并发互联网架构用的都是类似的模型,这种架构配合其他的无锁内存管理结构可以极大程序的减少由于锁导致的cpu等待。