生產者 與消費者模型 mutx cond

2021-08-19 16:19:04 字數 1761 閱讀 6131

#模型

生產者——消費者

##認識:

乙個盤子只能放5個蘋果,小明有100個蘋果,小張、小劉等著取盤子的蘋果;小明放供他們取。(盤子成了有界緩衝區)盤子裡面有5 個就不能放,盤子裡面為空不能取蘋果。

##實現原理:

利用互斥量和條件變數進行同步,實現的一種機制,遵循有界緩衝區不滿,生產者往裡面寫資料,寫滿了喚醒讀執行緒即消費者消費資料,消費空了則喚醒寫執行緒,生產者去生產資料

##理解:

#**

#include#include#include#include//20個資料

#define max_size 20

//有界緩衝區

#define buffer_size 8

//資料結尾

#define over -1

//定義乙個結構體

typedef struct st_pc

st_pc;

st_pc pc;

// 對結構體初始化 動態初始化

st_init(st_pc *p )

//摧毀

st_destory(st_pc *p)

//寫資料 滿了就阻塞 喚醒讀

void st_put(st_pc *p,int val)

p->buffer[p->write_pos] = val;

p->write_pos=(p->write_pos+1)%buffer_size;

pthread_cond_signal(&p->notempty);

pthread_mutex_unlock(&p->mutex);

}//取資料 空了就阻塞 喚醒寫

int st_get(st_pc *p)

int val = p->buffer[p->read_pos];

p->read_pos=(p->read_pos+1)%buffer_size;

pthread_cond_signal(&p->notfull);

pthread_mutex_unlock(&p->mutex);

return val;

}//生產者 寫

void *pro_fun(void *arg)

st_put(&pc,over);

}//消費者 讀

void *con_fun(void *arg)

}int main()

#總結

1、pthread_mutex_t mutexpthread_cond_cond有兩種初始化的方式,靜態的和動態的兩種;當自定義某種結構時,使用動態的方法

2、msg通過隱式的方式進行通訊(send、recv 為阻塞函式)

3、共享記憶體必須通過顯示額方式進行同步同信(sem,或互斥鎖、mutex和cond)

4、迴圈佇列的處理方式:(模可以是實現迴圈)

a、隊列為空的判斷 w_pos == r _pos%buffer;

r_pos = r_pos+1%(buffer) ;

b、佇列滿 空出最後乙個空間(之前的都是滿的) (w_pos+1)%buffer ==r_pos

w_pos = (w_pos+1)%buffer;

生產者與消費者模型

先介紹幾個函式 生產消費者模型 二者共享資料value,這裡,生產者是producter,消費者是consumer。生產者負責放物品到value中,消費者使用wait 等待生產者的通知。當得到通知後,消費者取出物品,並且用notify 通知生產者,可以再放下一批物品。例項 package cn.ed...

生產者與消費者模型

如圖 一共有三種關係 生產者與生產者的互斥關係,消費者與消費者的互斥關係,生產者與消費者的互斥且同步關係。兩種角色 生產者 執行緒 與消費者 執行緒 乙個交易場所 倉庫 一段記憶體空間,且可存可取 二 基於單向鍊錶的生產者消費者模型 1 我們這裡用乙個單鏈表當做那段共享記憶體,簡單實現生產者消費者模...

生產者與消費者模型

生產者 消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,模型圖如下所示 1 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...