寫該篇部落格原因:生產者-消費者模型挺常用的,筆者記性又不好,人也比較笨,只好自己寫著玩,以後自己用自己看自己寫的部落格就是。╮(๑•́ ₃•̀๑)╭
本部落格為參照書《深入理解計算機系統》來通過訊號量來實現生產者—消費者模型。
生產者—消費者模型:生產者和消費者執行緒共享乙個有n個槽(slots)的有限緩衝區。生產者不停的生產新的專案(item),並把它們插入到緩衝區中。消費者執行緒不斷地從緩衝區取出這些專案,然後消費他們。
要解決的問題:因為插入和取出緩衝區的專案都需要更新共享變數,所以我們必須保證對緩衝區的訪問是互斥的,並且需要保證緩衝區所有的資料都被消費者訪問到。
在本例中,通過訊號量來實現對緩衝區可寫空槽位數量(生產者)和可讀槽位數量(消費者)的計數(原子操作)。
在參照書後,寫出乙份c**和乙份c++**,其中c++**使用vector容器類存放資料,擴充套件性好。
**如下(c):
c實現:
編譯**命令(懶得寫makefile了):gcc -o test test.c producer_consumer_buf.c -lpthread
標頭檔案:producer_consumer_buf.h(定義對該模型的結構體,方便之後操作)
#ifndef _producer_consumer_buf_h_
#define _producer_consumer_buf_h_
#include #include #define p(sem) sem_wait(sem)
#define v(sem) sem_post(sem)
#define pv_init(sem,pshared,value) sem_init(sem,pshared,value)
typedef struct producer_consumer_buf
pcbuf_t;
int pcbuf_init(pcbuf_t *sp, int n);
int pcbuf_deinit(pcbuf_t *sp);
void pcbuf_insert(pcbuf_t *sp, int item);
void pcbuf_remove(pcbuf_t *sp, int *item);
#endif
c檔案:producer_consumer_buf.c(對生產者消費者模型的**實現)
#include #include #include "producer_consumer_buf.h"
/*function:init the model struct
params:model struct
*/int pcbuf_init(pcbuf_t *sp, int n)
memset(sp->buf,0x00,sizeof(int)*n);
sp->slots_num = n;
sp->slots_num = n;
sp->p_pos = sp->c_pos = 0;
pv_init(&sp->mutex,0,1); /*pshared=0 only this process*/
pv_init(&sp->slots,0,n);
pv_init(&sp->items,0,0);
return 0;}/*
function:destruct the model struct
params:model struct
*/int pcbuf_deinit(pcbuf_t *sp)
/*function:producer
params:model struct,in num
*/void pcbuf_insert(pcbuf_t *sp, int item)
/*function:consumer
params:model struct,out num
*/void pcbuf_remove(pcbuf_t *sp, int *item)
c檔案:test.c(多執行緒程式設計實現測試)
#include #include #include #include #include "producer_consumer_buf.h"
void *producer(void *vargp);
void *consumer(void *vargp);
int main(int argc, char **argv)
void *producer(void *vargp)
return null;
}void *consumer(void *vargp)
return null;
}
c++**:由於列印存在延時之類,所以看到的列印資訊並不嚴格,若要準確看到讀寫資訊應該到臨界段去列印。
編譯選項:g++ -std=c++11 -pthread -o test test.cpp
類定義:producer_consumer_buf.h
#ifndef _producer_consumer_buf_h_
#define _producer_consumer_buf_h_
#include #include #include using namespace std;
#define p_sem(sem) sem_wait(sem)
#define v_sem(sem) sem_post(sem)
#define pv_sem_init(sem,pshared,value) sem_init(sem,pshared,value)
template class sem_solt
;templatesem_solt::sem_solt(int snum)
slots_num = snum;
p_pos = c_pos = 0;
pv_sem_init(&mutex,0,1); /*pshared=0 only this process*/
pv_sem_init(&slots,0,snum);
pv_sem_init(&items,0,0);
}templatevoid sem_solt::sem_insert(t item)
templatevoid sem_solt::sem_remove(t &item)
#endif
測試:test.c
#include #include #include #include #include "producer_consumer_buf.h"
using namespace std;
void *producer(void *vargp);
void *consumer(void *vargp);
typedef struct str_test
st_t;
st_t temp;
sem_soltnewsolt(100);
int main(int argc, char **argv)
void *producer(void *vargp)
return null;
}void *consumer(void *vargp)
return null;
}
多執行緒之生產者消費者模型
生產者消費者 乙個最簡單的模型。兩個執行緒,乙個生產者,乙個消費者,生產者負責生產,消費者負責消費。分析 同步 生產者生產了之後,消費者進行讀取資料。wait 和notify機制 互斥 生產者生產時,消費者不能進行讀取。鎖機制。public class producerandconsumer cat...
Java 多執行緒之生產者消費者模型
package com.yuanlief public class main 共享資料類 class mydata 共享資料控制類 class sharedata catch interruptedexception e this.data data writeable false 標記已經生產 n...
多執行緒之生產者與消費者模型
在這個模型中我們需要有三個主要類,分別是商品類,生產者類以及消費者類。其中執行機制和我們平時的生產者與消費者的關係機制大同小異。在這個模型中,我們需要定義乙個容器來實現消費者與生產者之間的解耦,為了更貼近實際,採用fifo原則的佇列作為容器為最佳選擇,並且此模型還遵循著以下兩條規則 1.當生產者生產...