c语言环形缓存链表demo,环形缓存RingBuf的几种实现方式(数组,链表),及Disruptor的分析...

先贴个头文件的设计:

首先缓冲区中没有任何数据时,nIdWrite、nIdRead读写下标都为0。

为了判断缓冲区中是否还有数据可读或者可写,我判断的依据是:

1)当nIdWrite 等于 nIdRead时,表示缓冲区内没有任何数据可读;否则存在可读的数据

2)当剩余的空间小于我们所需要的空间时,表示缓冲区不能再继续写数据,否则可以进行写数据

3)这里说明一下,当剩余空间 等于 我们所需要的空间时,实际上也可以进行写数据的, 只不过需要用一个标记来标记缓冲区是否有数据。

否则,这个时候nIdWrite ** 等于 **nIdRead, 无法区分缓冲区到底是有数据还是满了的情况!

//C++编写了一个环形缓冲区,实际上是用数组来进行模拟。

#pragma once

class RingBuffer

{

public:

RingBuffer();

~RingBuffer();

public:

char* createRingBuf(int nByteSize);

bool writeRingBuf(char* ringBuf, char* pSrc, int nByteSize);

bool readRingBuf(char* ringBuf, char* pBuffer,int &nByteSize);

private:

bool isCanRead(char* ringBuf);// 判断是否可以再进行读操作

bool isCanWrite(char* ringBuf, int nByteSize);// 判读剩余的空间是否能够容纳nByteSize字节的数据

int getFreeOfRingBuf(char* ringBuf);// 计算剩余的空间大小

int getBytesOfRingBuf(char* ringBuf);/*从环形缓冲区获取可写字节数*/

int flushRingBuf(char* ringBuf);/*清环形缓冲区空间*/

private:

int m_nIdWrite; // 读下标标记

int m_nIdRead; // 写下标标记

};

参考链接:

聊聊db和缓存一致性的5种实现方式

数据存储在数据库中,为了加快业务访问的速度,我们将数据库中的一些数据放在缓存中,那么问题来了,如何确保db和缓存中数据的一致性呢?我们列出了5种方法,大家都了解一下,然后根据业务自己选择. 方案1 获 ...

js里常见的三种请求方式$.ajax、$.post、$.get分析

$.post和$.get是$.ajax的一种特殊情况: $.post和$.get请求都是异步请求,回调函数里写return来返回值是无意义的, 回调函数里对外部变量进行赋值也是无意义的. 即使是$.a ...

Web APi之认证(Authentication)两种实现方式【二】(十三)

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

转 Web APi之认证(Authentication)两种实现方式【二】(十三)

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...

全面剖析Smarty缓存机制一[三种缓存方式]

今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的 ...

Ajax请求被缓存的几种处理方式

Ajax请求被缓存的几种处理方式 我们都知道IE会针对ajax请求的地址缓存请求结果,直到缓存过期之前,针对相同地址发出的请求,只有第一次会请求会真正发送到服务端.在某种情况下,这种缓存机制确实能提高 ...

基于Metronic的Bootstrap开发框架经验总结(11)--页面菜单的几种呈现方式

在常规的后台管理系统或者前端界面中,一般都有一个导航菜单提供给用户,方便选择所需的内容.基于Metronic的Bootstrap开发框架,是整合了Metroinc样式,以及Boostrap组件模块的内 ...

Redis两种持久化方式(RDB&AOF)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现环形链表的基本代码: ```c #include <stdio.h> #include <stdlib.h> // 定义节点结构体 typedef struct node { int data; struct node *next; } Node; // 创建新节点 Node *new_node(int data) { Node *node = (Node *)malloc(sizeof(Node)); node->data = data; node->next = NULL; return node; } // 添加节点到链表末尾 void add_node(Node **head, int data) { Node *node = new_node(data); if (*head == NULL) { *head = node; (*head)->next = *head; } else { Node *curr = *head; while (curr->next != *head) { curr = curr->next; } curr->next = node; node->next = *head; } } // 打印链表 void print_list(Node *head) { if (head == NULL) { printf("List is empty.\n"); } else { Node *curr = head; do { printf("%d ", curr->data); curr = curr->next; } while (curr != head); printf("\n"); } } // 删除节点 void delete_node(Node **head, int data) { if (*head == NULL) { printf("List is empty.\n"); return; } Node *curr = *head; Node *prev = NULL; while (curr->data != data) { prev = curr; curr = curr->next; if (curr == *head) { printf("Node not found.\n"); return; } } if (curr == *head && curr->next == *head) { *head = NULL; } else if (curr == *head) { Node *last = *head; while (last->next != *head) { last = last->next; } *head = (*head)->next; last->next = *head; } else { prev->next = curr->next; } free(curr); } int main() { Node *head = NULL; add_node(&head, 1); add_node(&head, 2); add_node(&head, 3); add_node(&head, 4); add_node(&head, 5); print_list(head); delete_node(&head, 3); print_list(head); delete_node(&head, 1); print_list(head); delete_node(&head, 5); print_list(head); return 0; } ``` 在这个代码中,我们通过定义一个指向自身的头节点来实现环形链表。添加节点时,我们遍历链表找到最后一个节点,然后将新节点添加到最后一个节点的后面,并将其指向头节点。删除节点时,我们遍历链表找到要删除的节点,并将其从链表中移除,然后释放内存。需要注意的是,如果要删除的是头节点,我们需要特殊处理。如果链表只有一个节点,我们将头节点设为NULL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值