#模型
生產者——消費者
##認識:
乙個盤子只能放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 mutex
pthread_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 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...