C 筆記 實現乙個環形阻塞佇列

2021-09-14 04:45:35 字數 2707 閱讀 4690

環形阻塞佇列,顧名思義,首先,它是乙個佇列,然後,它應當是乙個環形,並且它是會進行阻塞的。但是根據我們的常識,記憶體位址是用乙個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 非法輸入!請重新輸...