- 论坛徽章:
- 9
|
回复 164# yulihua49
无锁的设计很复杂, 不是一言两语能够说完的, 有好多这方面的长论文, 对于初次的开发无锁产品的人员很容易陷入各类(例如:ABA等)错误中, 还涉及大量的CPU内存同步方面的知识,
最简单的高性能无锁队列是spsc_queue单生产者, 单消费者,
对于单生产者, 单消费者, 无锁主要是利用环形队列实现的, 现成的库中boost::lock_free_spsc_queue是一个典型的实现, 这个代码在Boost库中就有,自己读吧, 很多人第一次都看不懂,
boost::lock_free_spsc_queue本身代码没有问题, 唯一就是限制了T的类型,只支持常规数据(整数之类的),
前期开发网络层代码的时候,是直接使用boost. 今年重新开发了几个版本, 主要参考了linux系统调用的源代码高性能无锁队列的设计, 另外为了保证兼容性,没有像linux一样直接使用底层函数, 内存同步协议统一使用了C++14版本的std::atomic thread memory control协议(memory acquire/release) , 公司内部开发使用的wait_free_spsc_queue, 性能基本达到了每秒2-5亿队列处理能力(对于T对象是int,性能5亿TPS,对于T对象是shared_ptr,性能2亿TPS), 并发测试性能与单线程读写std::queue的性能基本一致, 达到了理想的性能.
公司内部库的设计优势是: 去掉了boost::lock_free_spsc_queue中内部的T对象内存释放~T()语句, 去掉了boost库的限制, 兼容性好,内存同步协议统一使用了C++14版本的std::atomic thread memory control协议(memory acquire/release) , 重新编写了内部的T对象内存释放的处理方式.
多生产者, 单消费者队列, 其实也是spsc_queue单生产者单消费者的扩展, 是再次封装wait_free_spsc_queue来实现的
一般工作中使用的无锁队列是wait_free_mpsc_ios_queue, 主要是通过与boost::io_service队列结合, 不需要自己生成thread, 利用boost::io_service在队列无任务的时候挂起的特性, 实现统一的CPU资源调度.
|
|