一个优秀的 ring buffer 或 cycle buffer 的实现代码

#define CIRCLE_BUFFSIZE 1024 * 1024
#define min(x, y) ((x) < (y) ? (x) : (y))

struct
cycle_buffer { unsigned char *buf; unsigned int size; unsigned int in; unsigned int out; pthread_mutex_t lock; }; static struct cycle_buffer *fifo = NULL; static int init_cycle_buffer(void) { int size = CIRCLE_BUFFSIZE, ret; ret = size & (size - 1); if (ret) return ret; fifo = (struct cycle_buffer *) malloc(sizeof(struct cycle_buffer)); if (!fifo) return -1; memset(fifo, 0, sizeof(struct cycle_buffer)); fifo->size = size; fifo->in = fifo->out = 0; pthread_mutex_init(&fifo->lock, NULL); fifo->buf = (unsigned char *) malloc(size); if (!fifo->buf) free(fifo); else memset(fifo->buf, 0, size); return 0; }
static int uninit_cycle_buffer(void) { if(!fifo) return -1; pthread_mutex_destroy(&fifo->lock); if(fifo->buf) free(fifo->buf); free(fifo); }
unsigned
int fifo_get(unsigned char *buf, unsigned int len) { unsigned int l; len = min(len, fifo->in - fifo->out); if(len <= 0) return 0; l = min(len, fifo->size - (fifo->out & (fifo->size - 1))); memcpy(buf, fifo->buf + (fifo->out & (fifo->size - 1)), l); memcpy(buf + l, fifo->buf, len - l); fifo->out += len; return len; } unsigned int fifo_put(unsigned char *buf, unsigned int len) { unsigned int l; len = min(len, fifo->size - fifo->in + fifo->out); l = min(len, fifo->size - (fifo->in & (fifo->size - 1))); memcpy(fifo->buf + (fifo->in & (fifo->size - 1)), buf, l); memcpy(fifo->buf, buf + l, len - l); fifo->in += len; return len; }

这个实现比较优秀,可自行改成java的实现。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个ring buffer(环形缓冲区)是一种常见的数据结构,可以用于在缓存数据时,实现快速的读写操作。下面是一个使用C语言实现的简单的ring buffer。 ``` #include <stdio.h> #define BUFFER_SIZE 10 typedef struct { int buffer[BUFFER_SIZE]; int head; int tail; } ring_buffer_t; void ring_buffer_init(ring_buffer_t *buffer) { buffer->head = 0; buffer->tail = 0; } int ring_buffer_push(ring_buffer_t *buffer, int data) { int next_tail = (buffer->tail + 1) % BUFFER_SIZE; if (next_tail == buffer->head) { // Buffer is full return -1; } buffer->buffer[buffer->tail] = data; buffer->tail = next_tail; return 0; } int ring_buffer_pop(ring_buffer_t *buffer, int *data) { if (buffer->head == buffer->tail) { // Buffer is empty return -1; } *data = buffer->buffer[buffer->head]; buffer->head = (buffer->head + 1) % BUFFER_SIZE; return 0; } int main() { ring_buffer_t buffer; int i, data; ring_buffer_init(&buffer); for (i = 0; i < 11; i++) { if (ring_buffer_push(&buffer, i) == -1) { printf("Buffer is full!\n"); } } for (i = 0; i < 11; i++) { if (ring_buffer_pop(&buffer, &data) == -1) { printf("Buffer is empty!\n"); } else { printf("Data: %d\n", data); } } return 0; } ``` 这里定义了一个`ring_buffer_t`结构体,它包含了一个长度为`BUFFER_SIZE`的`buffer`数组,以及头部和尾部的索引`head`和`tail`。`ring_buffer_init`函数初始化这些值。`ring_buffer_push`函数将数据放入缓冲区,`ring_buffer_pop`函数从缓冲区中取出数据。这些函数都使用了模运算来实现环形缓冲区的循环读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值