博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的无锁队列环形实现
阅读量:5109 次
发布时间:2019-06-13

本文共 2129 字,大约阅读时间需要 7 分钟。

/* * RingBuf.h * *  Created on: Feb 7, 2015 6:06:10 PM *      Author: xuzewen */#ifndef RINGBUF_H_#define RINGBUF_H_#include 
/** * * 多/单线程生产, 仅仅能单线程消费, 尺寸固定为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万条/秒. 单线程生产, 单线程消费, 两个线程接近跑满.

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4822815.html

你可能感兴趣的文章
python - socket - connection
查看>>
JQuery
查看>>
tensorflow中一种融合多个模型的方法
查看>>
基于json数据的jQuery无限级下拉菜单插件
查看>>
简单两步走 中兴V880获取权限方法
查看>>
DBSight 4.3.18 发布,J2EE搜索平台
查看>>
工厂模式
查看>>
ubuntu下开启root登陆
查看>>
HDOJ 2048 神、上帝以及老天爷(组合数学,全错位排列)
查看>>
'setw' : undeclared identifier
查看>>
输入任意个数字求和的小程序
查看>>
How Many Tables
查看>>
Go语言实践_实现一(客户端)对一(服务器端)聊天室
查看>>
开放API端口SIGN算法详细设计
查看>>
android pcm
查看>>
Linux下静态链接库的制作与使用
查看>>
Swift4 函数,例子代码
查看>>
012 内置锁和synchronized
查看>>
大型网站系统架构系列:负载均衡详解(二)
查看>>
如何从本地导入.nupkg文件
查看>>