文章目录

  • 概述
  • 示例
  • 引用

概述

ring buffer,或者说循环队列,是嵌入式开发中的一个基本模型,常用于命令队列,资源循环分配场合。

示例

ring_buffer.h ring buffer 封装API
testringbuffer.c 测试ring buffer api.

//ring_buffer.h
#include <stdlib.h>typedef struct s_ring_buffer{int tail;int head;int size;int item_size;void *buf;
} ring_buffer;static ring_buffer* ring_buffer_create(int item_size, int size)
{size = size + 1;//alloc one morevoid* buf = malloc(item_size * size);if (NULL == buf)return buf;ring_buffer *p_ring_buf = (ring_buffer*)malloc(sizeof(ring_buffer)); if (NULL == p_ring_buf)return p_ring_buf;p_ring_buf->head = 0; p_ring_buf->tail = 0; p_ring_buf->size = size;p_ring_buf->item_size = item_size;p_ring_buf->buf = buf;return p_ring_buf;
}
static void ring_buffer_free(ring_buffer *p_ring_buf)
{if (NULL != p_ring_buf->buf){free(p_ring_buf->buf);p_ring_buf->buf = NULL;free(p_ring_buf);}
}
static void* ring_buffer_get_tail(ring_buffer *p_ring_buf)
{void *item = NULL;int tail = p_ring_buf->tail;int size = p_ring_buf->size;int item_size = p_ring_buf->item_size;int n = (tail + 1) % size;if (n != p_ring_buf->head){item = p_ring_buf->buf + (item_size * tail);p_ring_buf->tail = n;}return item;
}
static void* ring_buffer_get_head(ring_buffer *p_ring_buf)
{if (p_ring_buf->head == p_ring_buf->tail)return NULL;int head = p_ring_buf->head;int size = p_ring_buf->size;int item_size = p_ring_buf->item_size;void *item = p_ring_buf->buf + (item_size * head);p_ring_buf->head = (head + 1) % size;return item;
}
static int ring_buffer_size(ring_buffer *p_ring_buf)
{int head = p_ring_buf->head;int tail = p_ring_buf->tail;int size = p_ring_buf->size;return (tail >= head) ? (size - 1 - tail + head) : (size - 1 - head + tail);
}
static int ring_buffer_capacity(ring_buffer *p_ring_buf)
{return p_ring_buf->size - 1;
}
//testringbuffer.c
#include "ring_buffer.h"
#include <stdio.h>void test_get_tail(ring_buffer *ring_buf){void *item = ring_buffer_get_tail(ring_buf);printf("item %p\n", item);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));item = ring_buffer_get_tail(ring_buf);printf("item %p\n", item);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));item = ring_buffer_get_tail(ring_buf);printf("item %p\n", item);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));}
void test_get_head(ring_buffer *ring_buf){void *item = ring_buffer_get_head(ring_buf);printf("item %p\n", item);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));item = ring_buffer_get_head(ring_buf);printf("item %p\n", item);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));item = ring_buffer_get_head(ring_buf);printf("item %p\n", item);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));}int main(){ring_buffer *ring_buf = ring_buffer_create(8, 2);printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));test_get_tail(ring_buf);test_get_head(ring_buf);return 0;
}

测试结果

$ ./test.exe
buffer size 2, capacity 2
item 0x8000003c0
buffer size 1, capacity 2
item 0x8000003c8
buffer size 0, capacity 2
item 0x0
buffer size 0, capacity 2item 0x8000003c0
buffer size 1, capacity 2
item 0x8000003c8
buffer size 2, capacity 2
item 0x0
buffer size 2, capacity 2

引用

Circular Queue

ring buffer示例相关推荐

  1. 环形缓冲区的实现原理(ring buffer)

    消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了.频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行.也许我们可以 ...

  2. 使用 Ring Buffer 完成数据传递

    使用 Ring Buffer 完成数据传递 概述 在前述章节中,我们依次介绍了 Queue.StreamBuffer.MessageBuffer.上述三者尽管提供了一定的数据缓存能力,但没有提供管理数 ...

  3. SQL Server 环形缓冲区(Ring Buffer) -- 介绍

    SQL Server 环形缓冲区(Ring Buffer) -- 介绍 以下关于Ring Buffer的介绍转载自: http://zh.wikipedia.org/wiki/%E7%92%B0%E5 ...

  4. leetcode 622. Design Circular Queue | 622. 设计循环队列(Ring Buffer)

    题目 https://leetcode.com/problems/design-circular-queue/ 题解 Ring Buffer 的实现,rear 指向新插入的位置,front 指向最旧的 ...

  5. Java 环形缓冲器(Ring Buffer)

    环形缓冲器(Ring Buffer):环形队列,这里使用数组实现,但并未用上环形功能,因为设置了队满直接出队清空队列,如果只读取部分数据,又或者想要覆盖冲写,则可以用上环形功能 package cha ...

  6. SQL Server 环形缓冲区(Ring Buffer) -- 环形缓冲在AlwaysOn的应用

    SQL Server 环形缓冲区(Ring Buffer) -- 环形缓冲在AlwaysOn的应用 可以从SQL Server环形缓冲区得到一些诊断AlwaysOn的信息,或从sys.dm_os_ri ...

  7. 解析Disruptor:写入ring buffer

    原文地址http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html 这是Disruptor end ...

  8. linux+循环buffer,说说循环缓冲区(Ring Buffer)

    关于循环缓冲区(Ring Buffer)的概念,其实来自于Linux内核(Maybe),是为解决某些特殊情况下的竞争问题提供了一种免锁的方法.这种特殊的情况就是当生产者和消费者都只有一个,而在其它情况 ...

  9. Ring Buffer (circular Buffer)环形缓冲区简介

    https://blog.csdn.net/langeldep/article/details/8888582 关于环形缓冲区的知识,请看这里 http://en.wikipedia.org/wiki ...

  10. Linux ftrace 1.1、ring buffer

    1.简介 ringbuffer是trace框架的一个基础,所有的trace原始数据都是通过ringbuffer记录的.ringbuffer的作用主要有几个: 1.存储在内存中,速度非常快,对系统性能的 ...

最新文章

  1. Android_开源框架_Volley实例
  2. File类的使用(java)
  3. 前端框架——Jquery——基础篇2__获取DOM节点的值
  4. 优秀程序员的秘密|宝贵经验分享
  5. 手动写sonar 插件
  6. 11篇SCI论文,多次跨专业,武大物理博士敲开美国顶尖生命医学研究中心大门...
  7. java hook全局钩子,牛逼骚操作:Java 虚拟机关闭钩子(Shutdown Hook)!
  8. 痛苦并愉快的被洗着_品牌洗脑
  9. python之作业--------购物车优化
  10. paip.提升开发效率---增量备份项目文件
  11. GNSS精密星历读取(matlab)
  12. dxf转换html5,移动端CAD版本转换如何输出DXF格式-迅捷CAD转换器
  13. 网络操作系统之VyOS部署
  14. 笔记:PJL的一些用法
  15. leetcode69
  16. 白领控诉:被逼下乡5年,我们的幸福何处寻找
  17. SPSS中的数据分析—信度效度检验【2】
  18. python读取文件名包含某字符的文件_Python 在当前和子目录中查找文件名中包含指定字符串的文件...
  19. 要么听我的,要么走开(摘自《代码之道》第8章)
  20. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

热门文章

  1. python学习笔记(汇总)
  2. 入职Apifox研发组三个月,我领悟了30个高效开发方法
  3. 【黄冈市中级人民法院在湖北行星传动设备有限公司的强制清算案件中的违法问题给投资者的启示】
  4. mysql 函数 人民币大写_sql 数字转人民币大写函数(两种方法)
  5. Java实现自动发送电子邮件 发送邮件验证码(附全部源码)
  6. python三维图旋转_python中的三维图像旋转
  7. PCU-285锡膏粘度计优点及特点
  8. 10015---MySQL--innodb_flush_log_at_trx_commit参数
  9. 笔记本搜不到WiFi是什么原因
  10. springboot vue uniapp公交路线查询系统源码