假設有n個資料採集執行緒負責採集資料,有1個入庫執行緒負責往資料庫寫資料,由於採集執行緒和入庫執行緒是非同步的,所以中間需要乙個快取區來作為採集執行緒和入庫執行緒之間通訊的橋梁,所以引入了迴圈佇列。
假設有n個採集執行緒,1個入庫執行緒,架構圖如下:
注意:(1)由於採集執行緒入隊時,操作的是隊尾,有n個執行緒同時操作隊尾,所以需要對這n個採集執行緒上鎖(任何時刻只有乙個採集執行緒在入隊操作)
(2)而入庫執行緒只有乙個,同時呢,入庫執行緒操作的是對頭,和採集執行緒互不干涉,所以入庫執行緒在入庫時不需要上鎖
#ifndef __cqueue_h__
#define __cqueue_h__
#include using namespace std;
template class ccirclequeue
else
}~ccirclequeue()
int size()
int space()
void empty()
int pop_front_n(t* data_buf, int buf_size)
else
}private:
int size_;
int head_;
int tail_;
t* data_ ;
};#endif
實現迴圈佇列
利用陣列實現迴圈佇列,head tail並不能判斷佇列空與滿,需要另外加上乙個輔助 include include includeusing namespace std typedef struct node node define len 20 typedef int elemtype class...
迴圈佇列實現
迴圈佇列就是當資料寫到結尾後,在回到開頭接著寫,該過程類似迴圈鍊錶。如何實現這個到結尾後又轉到開頭呢?很簡單,取模操作!上兩個圖是迴圈佇列的兩種狀態,以下所寫的所有函式都可以對照著這兩幅圖來看。如下 filename buffer.h ifndef buffer h define buffer h ...
迴圈佇列實現
假設是長度為5的陣列,初始狀態,空佇列如所示,front與 rear指標均指向下標為0的位置。然後入隊a1 a2 a3 a4,front指標依然指向下標為0位置,而rear指標指向下標為4的位置。出隊a1 a2,則front指標指向下標為2的位置,rear不變,如下圖所示,再入隊a5,此時front...