环形无锁队列的简易实现
2015-03-20 13:04
369 查看
/* * 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万条/秒. 单线程生产, 单线程消费, 两个线程接近跑满.
相关文章推荐
- 环形队列的链式实现(原创)
- 环形队列实现原理
- 无锁队列的环形数组实现(Lock Free Queue Implementation in Ring Array)
- 眉目传情之并发无锁环形队列的实现
- 简单环形队列实现
- 在一读一写限制下,无锁环形队列如何实现?
- C++数据结构环形队列Deque实现
- <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现
- 环形队中实现队列的基本运算
- 无锁队列的环形数组实现
- 一读一写情况下,无锁环形队列如何实现?
- 编写一个程序,实现顺序环形队列的各种基本运算。
- 一个简易的事件队列的实现
- 无锁队列的环形数组实现
- 环形队列实现元素逆置
- 环形队列实现原理
- 环形队列实现异步传输数据间的缓存
- java之环形队列的实现
- Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列
- 简单的无锁队列环形实现