双缓存静态循环队列(三)

 1 // TwoBufQueue.h: interface for the CTwoBufQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4
 5 #if !defined(AFX_TWOBUFQUEUE_H__EA19608F_9562_4803_95C4_5C4A574CC928__INCLUDED_)
 6 #define AFX_TWOBUFQUEUE_H__EA19608F_9562_4803_95C4_5C4A574CC928__INCLUDED_
 7
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 #include "BufQueue.h"
12
13 // 双缓存队列,减少读写操作的互斥碰撞,向无锁算法靠近,乒乓存储原理
14
15 /*
16 1)对于读写双方读写操作你比较频繁,双方的的瞬时吞吐量存在差异,可以很好的利用缓存空间特性提读写效率。
17
18 2)消费数据的速度总是大于生产数据的的速度,本数据结构与单缓存队列无异。
19
20 3)可以减少了读写互斥消耗,同时读,同时写互斥仍存在。
21 */
22
23 class CTwoBufQueue
24 {
25 public:
26     int GetdataSize();
27     int Write(const char *pBuf, int writeBytes);
28     int Read(char *pBuf, int readBytes);
29     CTwoBufQueue();
30     virtual ~CTwoBufQueue();
31 private:
32     void private_SwitchPointer();
33     CBufQueue m_Queue_A;
34     CBufQueue m_Queue_B;
35     CBufQueue *m_pRead_Q;
36     CBufQueue *m_pWrite_Q;
37     CCritcalS m_critcal;
38 };
39
40 #endif // !defined(AFX_TWOBUFQUEUE_H__EA19608F_9562_4803_95C4_5C4A574CC928__INCLUDED_)

CTwoBufQueue_H

 1 // TwoBufQueue.cpp: implementation of the CTwoBufQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4
 5 #include "stdafx.h"
 6 #include "OverlapRoutine.h"
 7 #include "TwoBufQueue.h"
 8
 9 #ifdef _DEBUG
10 #undef THIS_FILE
11 static char THIS_FILE[]=__FILE__;
12 #define new DEBUG_NEW
13 #endif
14
15 //////////////////////////////////////////////////////////////////////
16 // Construction/Destruction
17 //////////////////////////////////////////////////////////////////////
18
19 CTwoBufQueue::CTwoBufQueue()
20 {
21      this->m_pRead_Q = &m_Queue_A;
22      this->m_pWrite_Q = &m_Queue_B;
23 }
24
25 CTwoBufQueue::~CTwoBufQueue()
26 {
27
28 }
29
30 // 交换缓存对象指针
31 void CTwoBufQueue::private_SwitchPointer()
32 {
33     CBufQueue *pTemp = this->m_pRead_Q;
34     this->m_pRead_Q = this->m_pWrite_Q;
35     this->m_pWrite_Q = pTemp;
36 }
37
38 int CTwoBufQueue::Read(char *pBuf, int readBytes)
39 {
40     int res = this->m_pRead_Q->Read(pBuf,readBytes);
41     if(res>0)
42     {
43         return res;
44     }else //读缓存空 ,交换缓存对象指针
45     {
46         this->m_critcal.Lock();
47         this->private_SwitchPointer();
48         this->m_critcal.Free();
49
50         return this->m_pRead_Q->Read(pBuf,readBytes);
51     }
52 }
53
54 // 写操作指针对当前buf对象,不做交换
55 int CTwoBufQueue::Write(const char *pBuf, int writeBytes)
56 {
57     this->m_critcal.Lock();
58     int res = this->m_pWrite_Q->Write(pBuf,writeBytes);
59     this->m_critcal.Free();
60
61     return res;
62 }
63
64 int CTwoBufQueue::GetdataSize()
65 {
66     return this->m_pRead_Q->GetdataSize()+this->m_pWrite_Q->GetdataSize();
67 }

CTwoBufQueue_CPP

时间: 2024-08-24 12:15:43

双缓存静态循环队列(三)的相关文章

顺序循环队列

一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2 ElemType elem[MaxSize]; 3 int head, tail; 4 }; 即利用数组elem顺序存储队列中的所有元素,利用整型变量head和tail分别存储队首元素和队尾(或队尾下一

数据结构基础(5)--队列和循环队列详解--静态方式

队列的具体应用: 所有和事件有关的操作都有队列的影子. (例如操作系统认为先进来的先处理) 定义: 一种可是实现"先进先出"的存储结构 分类: 链式队列:用链表实现 静态队列:用数组实现 静态队列通常都必须是循环队列,为了减少 内存浪费. 循环队列 : 1.静态队列为什么必须是循环队列 如果用传统意义的数组实现队列,无论入队还是出队,rear和front指针只能+不能-: 比 F元素下标小的的数组元素下标就浪费了. 循环队列怎么用呢? 当出现这种情况时,如果仍然需要插入元素,那么f指向

三帧帧差法改进——使用循环队列减少深拷贝

使用循环队列的三帧帧差法 帧差法是背景减图法中的一种,只不过是帧差法不需要建模,因为它的背景模型就是上一帧的图,所以速度非常快.对于帧差法的"双影"现象,有人提出来了三帧差法.其原理如下所示: 1. 由I(t) - I(t-1)得到前景图   F1 2. 由I(t+1) - I(t)得到前景图  F2 3.  F1 ∩ F2得到前景图        F3 为了减少图像深拷贝带来的时间开销,我使用了一个储存三帧图像的循环队列,只需调整队首.队尾指针,就可以定位相对的前.中.后三帧,避免直

数据结构与算法(c++)——双缓存队列

"双缓存队列"是我在一次开发任务中针对特殊场景设计出来的结构.使用场景为:发送端持续向接收端发送数据包--并且不理会接收端是否完成业务逻辑.由于接收端在任何情况下停止响应即可能产生数据丢失,因此无法简单的设计一条线程安全队列来对数据写入或读取(读取数据时将队列上锁视为对写入的停止响应). 鉴于此,我的设计思路如下: 接收端首先向A队列中写入数据,然后当数据处理请求到来的时候切换到B队列继续写入,之后将A队列中的数据交给数据处理模块,处理完成以后A队列数据清空.当下一次数据处理请求到来时

设计循环队列——写起来最清爽的还使用原生的deque 双端队列

622. 设计循环队列 难度中等89收藏分享切换为英文关注反馈 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为“环形缓冲器”. 循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间.但是使用循环队列,我们能使用这些空间去存储新的值. 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队

数据结构之队列(三)——循环队列

循环队列采用顺序存储的方式(数组),基本思想是通过一个数组存储数据,两个下标front和rear分别指向队头和队尾 由于假溢出现象:采用循环队列,又由于循环队列无法判断队列是空还是满,所以采用损失一个元素为空的代价来分别队列为空还是为满 与链队列不同的是: 循环队列的队头指针(下标)不是指向什么头结点,而是直接指向当前队头的元素 循环队列的队尾指针(下标)不是指向最后一个元素,而是指向最后一个元素的下一个下标 当循环队列为空的时候,队尾和队头下标均指向啊a[0] 循环队列的定义 一个数组存放数据

带阻塞读模式的循环队列实现

部门准备开发一个项目,这个项目其中一个模块内部实现需要用到队列来实现各小模块内部通讯, 为了实现高效的数据传输模式,决定放弃轮询的方式,改用阻塞方式实现一个循环队列.后来项目 取消了,但该部分代码也写好测试成功了,不想浪费了,就贴出来提供给有需要的人.所有代码和 测试文档我会打包上传到我的个人空间. 函数说明如下: 所有函数成功返回0,失败返回错误码. 该说明文档只是简要说明该函数库,详细情况,请结合代码. 1.该函数库实现了一个先进先出队列的功能,有如下特点 <1>线程安全,该队列出队入队均

数据结构之循环队列c语言实现

    队列是一种先入先出的结构,数据从队列头出,队尾进.在linux内核中进程调度,打印缓冲区都有用到队列.     队列有多种实现方式,可以用链表,也可以用数组.这里用数组来实现一个简单的循环队列.首先创建一个大小为8的队列如下,队列头尾指针指向同一块内存,          当从队列尾部插入一个数据后变成下面的情形,为了便于处理,这里始终会浪费一个空间 继续插入数据,直到出现以下情形,表示队列满了, 接下来看一下出队的情形,从队列头出队3个元素, 再添加三个元素后队列又变成满的了, 在上面

47 _ 循环队列程序演示.swf

通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h> #include <stdio.h> #include <stdlib.h> typedef struct Queue{ int * data;//存储的数据,指向一个数组 int font ;//队列数据删除 int rear;//队列数据的添加 }QUEUE ,*PQUEUE