介绍
windows下使用的是postthreadmessage、getmessage,考虑要跨平台,所以打算自己实现消息队列
无锁队列原理
CAS操作——Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作。
CAS的原子指令:
1 | bool compare_and_swap (int *accum, int *dest, int newval) |
- GCC的CAS:
1 | bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) |
- windows 的CAS:
1 | InterlockedCompareExchange ( __inout LONG volatile *Target, |
- C++11中的CAS
1 | template< class T > |
无锁队列就是基于CAS来实现的。
备选方案
std::list + std::mutex
boost::lockfree::queue
boost::lockfree::spsc_queue
其他队列
https://zhuanlan.zhihu.com/p/55583561
未比较
测试性能方法
- 生产500w数据
- 消费500w数据
- 串行消费耗时
- 测试机器
1
windows i5-7500 @3.4GHz
测试代码
写的有点乱
1 | #include <cstdio> |
结论
队列 | 时间(ms) |
---|---|
windows | 未验证 |
list+mutex | 766 |
lockfree::queue | 1156 |
lockfree::spsc_queue | 47 |
单生产单消费模式下lockfree::spsc_queue 的确最优秀,但是我们的服务采用的是多生产单消费模式,性能上也足够了,所以还是暂时先用list+mutex。
注:单生产单消费者套在多生产单消费里面,会导致数据丢失。