多執行緒程式設計之生產者消費者模型 C C 語言實現

2021-08-31 10:04:17 字數 3617 閱讀 2246

寫該篇部落格原因:生產者-消費者模型挺常用的,筆者記性又不好,人也比較笨,只好自己寫著玩,以後自己用自己看自己寫的部落格就是。╮(๑•́ ₃•̀๑)╭ 

本部落格為參照書《深入理解計算機系統》來通過訊號量來實現生產者—消費者模型。

生產者—消費者模型:生產者和消費者執行緒共享乙個有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.當生產者生產...