生產者/消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,模型圖如下所示:
(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 整合執行緒安全的出隊操作 手撕生產者與消費者模型 實現執...