C++數據結構與算法之雙緩存隊列實現方法詳解
本文實例講述了C++數據結構與算法之雙緩存隊列實現方法。分享給大家供大家參考,具體如下:
“雙緩存隊列”是我在一次開發(fā)任務中針對特殊場景設計出來的結構。使用場景為:發(fā)送端持續(xù)向接收端發(fā)送數據包——并且不理會接收端是否完成業(yè)務邏輯。由于接收端在任何情況下停止響應即可能產生數據丟失,因此無法簡單的設計一條線程安全隊列來對數據寫入或讀取(讀取數據時將隊列上鎖視為對寫入的停止響應)。
鑒于此,我的設計思路如下:
接收端首先向A隊列中寫入數據,然后當數據處理請求到來的時候切換到B隊列繼續(xù)寫入,之后將A隊列中的數據交給數據處理模塊,處理完成以后A隊列數據清空。當下一次數據處理請求到來時,再將寫入請求切換回A隊列,并把B隊列中的數據提交給數據處理模塊再清空隊列B,輪流作業(yè)。
有了思路以后,代碼就比較簡單了。
#include <list>
template<typename T>
class DoubleArray {
struct NODE {
T t;
NODE* next;
};
int size_a;
int size_b;
NODE* header_a;
NODE* header_a_cur;
NODE* header_b;
NODE* header_b_cur;
int trigger;
public:
DoubleArray() : size_a(0), size_b(0), trigger(0), header_a(0), header_a_cur(0), header_b(0), header_b_cur(0) {
}
int push(T t);
std::list<T>& fetch(std::list<T>& list);
};
template<typename T>
int DoubleArray<T>::push(T t) {
NODE *n = new NODE;
n->t = t;
n->next = 0;
if (size_a == 0 && trigger == 0) {
header_a = n;
header_a_cur = n;
size_a++;
} else if (size_b == 0 && trigger == 1) {
header_b = n;
header_b_cur = n;
size_b++;
} else {
switch (trigger) {
case 0:
header_a_cur->next = n;
header_a_cur = n;
size_a++;
break;
case 1:
header_b_cur->next = n;
header_b_cur = n;
size_b++;
break;
}
}
}
template<typename T>
std::list<T>& DoubleArray<T>::fetch(std::list<T>& list) {
switch (trigger) {
case 0:
if (header_a != 0) {
// change b
trigger = 1;
// fetch a
NODE* temp = header_a;
while (temp) {
list.push_back(temp->t);
temp = temp->next;
}
// delete a
temp = header_a;
for (int i = 0; i < size_a; ++i) {
NODE* p = temp;
temp = temp->next;
delete p;
}
size_a = 0;
header_a = 0;
header_a_cur = 0;
}
break;
case 1:
if (header_b != 0) {
// change a
trigger = 0;
// fetch b
NODE* temp = header_b;
// delete b
while (temp) {
list.push_back(temp->t);
temp = temp->next;
}
temp = header_b;
for (int i = 0; i < size_b; ++i) {
NODE* p = temp;
temp = temp->next;
delete p;
}
size_b = 0;
header_b = 0;
header_b_cur = 0;
}
break;
}
return list;
}
注:開發(fā)環(huán)境與IDE分別為CentOS 7,NetBeans 8.2
希望本文所述對大家C++程序設計有所幫助。
欄 目:C語言
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1243.html
您可能感興趣的文章
- 04-02c語言沒有round函數 round c語言
- 01-10數據結構課程設計- 解析最少換車次數的問題詳解
- 01-10數據結構課程設計-用棧實現表達式求值的方法詳解
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現與遞歸實現的方法(C++)
- 01-10深入理解atoi()與itoa()函數的用法
- 01-10C++大數模板(推薦)


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結
- 01-11ajax實現頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數量限制代碼修改


