环形无锁队列的简易实现
来源:互联网 发布:mac页面搜索快捷键 编辑:程序博客网 时间:2024/05/22 06:06
/* * RingBuf.h * * Created on: Feb 7, 2015 6:06:10 PM * Author: xuzewen */#ifndef RINGBUF_H_#define RINGBUF_H_#include <libmisc.h>/** * * 多/单线程生产, 只能单线程消费, 尺寸固定为0x10000. * * */class RingBuf{public:ushort ccur; /** 消费游标. */uint pcur; /** 生产游标. */size_t* ring;public:RingBuf();virtual ~RingBuf();public:bool push(void* e); /** 添加, 反复尝试, 直到成功为止. */void* pop(); /** 弾出, 总是立即返回, 无元素时返回空. */int size(); /** 返回元素个数. */};#endif /* RINGBUF_H_ */
实现:
/* * RingBuf.cpp * * Created on: Feb 7, 2015 6:06:10 PM * Author: xuzewen */#include "RingBuf.h"RingBuf::RingBuf(){this->pcur = 0;this->ccur = 0;this->ring = (size_t*) calloc(1, sizeof(size_t) * 0x10000);}/** 添加, 反复尝试, 直到成功为止. */bool RingBuf::push(void* f){while (!__sync_bool_compare_and_swap(this->ring + (this->pcur & 0x0000FFFF), 0, (size_t) f))usleep(1000);//__sync_fetch_and_add(&this->pcur, 1);/** 多线程生产者. *///++this->pcur; /** 单线程的生产者. */return true;}/** 弾出, 总是立即返回, 无元素时返回空. */void* RingBuf::pop(){if (this->ring[this->ccur] == 0)return NULL;void* r = (void*) this->ring[this->ccur];this->ring[this->ccur] = 0;++this->ccur;return r;}int RingBuf::size(){int size = 0;for (int i = 0; i < 0x10000; ++i){if (this->ring[this->ccur] != 0)++size;}return size;}RingBuf::~RingBuf(){}
测试:
/* * main.cpp * * Created on: Mar 20, 2015 12:09:33 PM * Author: xuzewen */#include "RingBuf.h"static RingBuf* r = new RingBuf();void svc(){ullong last = 0;ullong ts = 0;while (1){ullong c = (ullong) r->pop();if (c == 0) /** not NULL. */{usleep(100);continue;}if (c - last != 1){printf("it`s a bug, c: %llu, last: %llu\n", c, last);exit(1);}last = c;if ((c % 20000000) == 0){ullong now = Misc::getDiDa(); /** 系统嘀嗒声. */printf("ts: %llu, last: %llu\n", now - ts, last);ts = now;}}}int main(int argc, char **argv){Misc::newThread(svc); /** 单线程消费. *///for (ullong c = 1;; ++c) /** 单线程生产. */r->push((void*) c); /** 按顺序push. */return EXIT_SUCCESS;}
测试结果:
按每2000万条消息, 消耗470毫秒算, 并发数为4255万条/秒. 单线程生产, 单线程消费, 两个线程接近跑满.
0 0
- 环形无锁队列的简易实现
- 并发无锁环形队列的实现
- 眉目传情之并发无锁环形队列的实现
- 无锁环形队列
- 用环形队列简易实现排号机的功能
- 环形队列的实现
- 在一读一写限制下,无锁环形队列如何实现?
- 一读一写情况下,无锁环形队列如何实现?
- 一读一写情况下,无锁环形队列如何实现?
- 无锁队列的环形数组实现(Lock Free Queue Implementation in Ring Array)
- 环形消息队列的实现
- 环形队列的c++实现
- 环形队列的C++实现
- 环形队列的实现原理
- 环形队列的数组实现
- 环形顺序队列的实现
- 数组实现的 环形队列
- 环形无锁队列-版本1
- 数组与指针
- 什么是A记录、MX记录、CNAME记录
- iOS 取消多余tableView的横线的写法
- 逆序排列
- C++程序设计之四书五经—C++书籍推荐
- 环形无锁队列的简易实现
- 分享界面用tablelayout
- 常用的几个矩阵求导公式
- Docker源码分析
- HTML5 canvas粒子系统打造逼真飘雪特效
- PHP获取当前域名$_SERVER['HTTP_HOST']和$_SERVER['SERVER_NAME']的区别
- 求 Fibonacci数列前n项之和....
- Haproxy介绍及其定位
- YV12 and NV12