Linux 基於環形buf的多消費者多生產者問題

2021-07-27 08:35:38 字數 866 閱讀 1245

生產者消費者問題,是乙個多執行緒

同步問題的經典案例。該問題描述了兩個共享固定大小

緩衝區的

執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

下面是該問題的環形模型

當生產者在生產時,消費者不能進行消費,當消費者在消費時生產者不能進行生產,這些都說的是在同一資料操作區進行操作

以上圖為例,即消費者永遠不能追上生產者,生產者永遠不能追上消費者,更別說超過一圈了

下面是用**實現

#include#include#include#include#include#define _size_ 64

sem_t blanks;

sem_t datas;

int buf[_size_]=;

//pthread_lock_t mylock;

void *product(void * arg)}}}

void *consumer()

}sem_post(&blanks);

}}void run()

int main()

執行結果

可以看出有多個消費者在消費,多個生產者在生產,並且消費者總是在生產者後面消費

環形緩衝buf的建立

用於網路接受到位元組時,放入緩衝buf,然後取出解析。使用時需要上鎖 typedef struct tagringbuf tringbuf 建立環形buf handle ringbufcreate u32 dwbufsize memset ptringbuf,0,sizeof tringbuf pt...

Linux 基於環形佇列的生產消費模型

在上篇部落格基於阻塞佇列的生產者消費者模型中我介紹了什麼是生產者消費者模型,還沒了解的可以戳鏈結檢視。本篇部落格也是實現乙個生產者消費者模型,只是這篇部落格我將基於迴圈佇列實現生產消費模型。posix 訊號量 這裡要注意了,我們這次使用的是基於posix的訊號量,千萬不要誤認為是systemv的訊號...

基於svg的環形進度條

其實需求是這麼乙個基於日期的環形進度條,開始用css3寫了一下感覺太麻煩了,於是抽了點時間用svg畫了乙個。不多說 上 css html 70js 獲取當前時間設定為開始時間,年月日 var startdate new date startyear 2016,startmonth 1,startda...