實現有大小限制的併發阻塞佇列

2021-06-20 00:57:22 字數 985 閱讀 5750

對於阻塞佇列,當佇列滿時寫執行緒阻塞,當隊列為空時讀執行緒阻塞。使用list為基礎資料結構結合互斥鎖來實現有大小限制的併發阻塞佇列。

#include#includeusing namespace std;

template class threadsafecontainer

; ~threadsafecontainer()

; void push(boost::shared_ptrpelement)

list_.push_back(pelement);

pthread_mutex_unlock(&lock_);

if(was_empty)

}boost::shared_ptrpop()

boost::shared_ptrmax = list_.front();

list_.pop_front();

pthread_mutex_unlock(&lock_);

if(was_full)

pthread_cond_broadcast(&wcond_);

return max;

}int size()

private:

list> list_;

int maxsize_;

pthread_mutex_t lock_;

pthread_cond_t rcond_, wcond_;

};

這個阻塞佇列有兩個條件變數而不是乙個。如果佇列滿了,寫執行緒等待_wcond條件變數;讀執行緒在從佇列中取出資料之後需要通知所有執行緒。同樣,如果佇列是空的,讀執行緒等待_rcond變數,寫執行緒在把資料插入佇列中之後向所有執行緒傳送廣播訊息。如果在傳送廣播通知時沒有執行緒在等待_wcond_rcond,會發生什麼?什麼也不會發生;系統會忽略這些訊息。還要注意,兩個條件變數使用相同的互斥鎖。

參考網頁:

redis實現有序的訊息佇列

redis是什麼東西就不多說了,網上文章一搜一大堆。首先來說一下我要實現的功能 類似乙個訊息中轉站吧,如果有人要傳送訊息,先將訊息發到我這裡來,然後我這邊進行 為的就是有乙個統一的管理和修改時方便,而且所有的訊息有優先順序,也會有定時傳送 如果同一時間訊息過多,則會有延遲 思路 首先乙個是將這兩個分...

單執行緒的redis如何實現阻塞佇列

從redis的api可以了解到lpop,rpop可以實現乙個阻塞式佇列。那疑問就來了,redis不是單執行緒的嗎,如果阻塞了,那其他操作就執行不了呀。事實不是這樣的 redis的執行緒模型,是接收客戶端命令的執行緒時 i o 多路復用的,再通過檔案事件分配器單執行緒執行的。如下圖,程式總是會將所有產...

C 實現乙個簡易的阻塞佇列

阻塞佇列是多執行緒中常用的資料結構,對於實現多執行緒之間的資料交換 同步等有很大作用。阻塞佇列常用於生產者和消費者的場景,生產者是向佇列裡新增元素的執行緒,消費者是從佇列裡取元素的執行緒。簡而言之,阻塞佇列是生產者用來存放元素 消費者獲取元素的容器。考慮下,這樣乙個多執行緒模型,程式有乙個主線程 m...