對於阻塞佇列,當佇列滿時寫執行緒阻塞,當隊列為空時讀執行緒阻塞。使用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...