生產者與消費者模型

2021-08-18 21:29:24 字數 2100 閱讀 1034

生產者/消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,模型圖如下所示:

(1) 三種關係:三種關係分別指的是:消費者和消費者,生產者和生產者,生產者和消費者;其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的依賴關係。

(2)兩類角色:指的是生產者和消費者;

(3)乙個交易場所:交易場所指的是生產者和消費者之間進行資料交換的倉庫,這塊倉庫相當於乙個緩衝區,生產者負責把資料放入到緩衝區中,消費者負責把緩衝區中的資料取出來;

1、生產者生產的時候消費者不能消費

2、消費者消費的時候生產者不能生產

3、緩衝區空時消費者不能消費

4、緩衝區滿時生產者不能生產

用單鏈表作為該模型的交易場所,充當「倉庫」的角色,建立兩個執行緒,乙個為生產者,乙個為消費者,生產者每生產乙個就頭插到單鏈表中,消費者每消費乙個就從單鏈表中刪除乙個節點,並對該模型進行加鎖和加條件變數,使得上述三種關係得到滿足:

1 #include2 #include3 #include4 #include5 #include6 

7 typedef struct node

8 node,*node_p,**node_pp;

node_p list=null;

pthread_mutex_t mylock= pthread_mutex_initializer;

pthread_cond_t mycond=pthread_cond_initializer;

13 node_p allocnode(int data)

14 20 n->data=data;

21 n->next=null;

22 return n;

23 }

24 25 void init(node_pp list)

26 32 }

33 34 void pushfront(node_p list ,int data)

35 43

44 n->next=list->next;

45 list->next=n;

46 }

47 48 void delnode(node_p del)

49 53

54 void popfront(node_p list,int *data)

55 63 else

66 }

67 68 int isempty(node_p list)

69 76

77 void destroy(node_p list)

78 85 delnode(list);

86 }

87 88 void showlist(node_p list)

89 97 printf("\n");

98 }

99 103

104 void * consumer(void *arg)

105

114 popfront(list,&data);

115 pthread_mutex_unlock(&mylock);

116 printf("consumer:%d\n",data);

117 }

118 return null;

119 }

120

121 void * producer(void *arg)

122

134 return null;

135 }

136

137 int main()

138

執行結果:

生產者與消費者模型

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

生產者與消費者模型

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

生產者與消費者模型

一種場所,兩種角色,三種關係 功能 解耦合,支援忙閒不均,支援併發 stl std queue 非執行緒安全 class blockqueue queuepush int data 整合執行緒安全的入隊操作 queuepop int data 整合執行緒安全的出隊操作 手撕生產者與消費者模型 實現執...