環形阻塞佇列,顧名思義,首先,它是乙個佇列,然後,它應當是乙個環形,並且它是會進行阻塞的。但是根據我們的常識,記憶體位址是用乙個long long int來儲存的,我們儲存的資料的位址無法繞成乙個環,所以我們想要成環的話,需要我們自己去處理。
如上圖,相比環狀實現的來說,資料在記憶體中的儲存更接近線性實現那樣。線性實現和環形實現中,我們都記錄著隊頭、隊尾。如果是乙個記憶體中,資料可以儲存為環形,那麼我們只需要在寫入資料的時候,注意寫在隊尾,讀取資料時,從堆頭開始讀取就行了。但是很明顯,資料在記憶體中無法儲存位環形,所以我們還需要做以下處理:
根據實現原來,我們來用c++11進行實現,首先我們來定義標頭檔案,為了這個佇列可以儲存各類資料,我們將佇列定義為乙個模板類,內容如下:
#pragma once
#include
#include
#include
template
class circleblockqueue
;//用來記錄寫入位置的游標
uint64_t writepos
;//當前佇列中有效資料的長度
uint64_t currentdatalength
;//用來實現阻塞的互斥鎖及訊號量
std:
:mutex mutex;
std:
:condition_variable capacitylock;
bool clearflag;
bool innerpush
(t * data,uint64_t length)
;public:
explicit circleblockqueue
(uint64_t size);~
circleblockqueue()
;//向佇列中新增資料
bool push
(t * data,uint64_t length)
;//從佇列中讀出資料
uint64_t pop
(t * data,uint64_t length)
;//清除佇列中的資料
void
clear()
;//佇列資料長度
uint64_t length()
;};#include
"circleblockqueue.inl"
#include
#include
template
circleblockqueue::
circleblockqueue
(uint64_t size)
:size
(size)
template
circleblockqueue::
~circleblockqueue()
template bool circleblockqueue::
innerpush
(t *t, uint64_t length)
else
return true;
}return false;
}template
bool circleblockqueue::
push
(t *t, uint64_t length)
capacitylock.
wait
(lck);}
else
}while
(!clearflag)
; clearflag = false;
}template
uint64_t circleblockqueue::
pop(t *t, uint64_t length)
//被讀取的資料不是在首尾兩段
if(size - readpos >= realreadlength)
else
capacitylock.
notify_all()
;return realreadlength;
}return0;
}template
void circleblockqueue::
clear()
template
uint64_t circleblockqueue::
length()
實現了乙個環形阻塞佇列後,我們需要對實現進行測試,看看實現是否符合我們的預期:
void
writethread
(circleblockqueue<
char
>
* queue)
}void
queuetest()
else
if(cmd ==
"exit"
)else
} testqueue.
clear()
;}void
main()
其輸入輸出如下:
結合**,從結果可以看到,push、pop、clear方法的結果都符合我們的預期,這樣乙個環形阻塞佇列就實現完成了。
C 實現乙個簡易的阻塞佇列
阻塞佇列是多執行緒中常用的資料結構,對於實現多執行緒之間的資料交換 同步等有很大作用。阻塞佇列常用於生產者和消費者的場景,生產者是向佇列裡新增元素的執行緒,消費者是從佇列裡取元素的執行緒。簡而言之,阻塞佇列是生產者用來存放元素 消費者獲取元素的容器。考慮下,這樣乙個多執行緒模型,程式有乙個主線程 m...
動手寫乙個阻塞佇列
之前看佇列,都是停留在看和使用的階段。再次看佇列的時候,忽然發現並沒有深入到底層。比如 阻塞佇列時如何阻塞的呢?是監聽,還是等待呢?然後看著看著就看到了lock和reentrantlock,為什麼不使用synchronized呢?為什麼使用condition,condition是什麼呢?wait,n...
python筆記 實現乙個簡單的計算器
def showgui 簡單使用者介面 print 請使用者選擇運算 print 1 相加 print 2 相減 print 3 相乘 print 4 相除 choice int input 請輸入您的選擇 1 2 3 4 if choice 1or choice 4 print 非法輸入!請重新輸...