1. 程式人生 > >生產者和消費者問題(1)

生產者和消費者問題(1)

truct class 放置 nal create 變量 std tex include

前提:本文是基於Linux系統下的學習

 1 //實現消費者和生產者的概念
 2 //數據結構  鏈表
 3 //生產者將新的產品放置到鏈表的頭部
 4 //消費者從鏈表的頭部取出數據
 5 //生產過剩沒有考慮
 6 #include <stdio.h>
 7 #include <pthread.h>
 8 #include <stdlib.h>
 9 #include <time.h>
10 #include <unistd.h>
11 
12 struct node;
13 typedef struct node node_t;
14 typedef struct
node* list_t; 15 struct node{ 16 int data; 17 node_t *next; 18 }; 19 20 list_t head=NULL;//指向鏈表的頭指針 21 //靜態初始化mutex鎖 22 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 23 //靜態初始化一個條件變量 24 pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 25 //生產者線程 26 void* product(void *arg){ 27 node_t *new; 28
while(1){ 29 //產生一個新的節點 30 new=(list_t)malloc(sizeof(node_t)); 31 new->data=rand()%1000+1; 32 new->next=NULL; 33 printf("p:%d\n",new->data); 34 35 //加鎖 36 pthread_mutex_lock(&mutex); 37 //將新節點插入到鏈表的頭部 38 new->next=head;
39 head=new; 40 //解鎖 41 pthread_mutex_unlock(&mutex); 42 pthread_cond_signal(&cond); 43 sleep(rand()%5+1); 44 } 45 } 46 47 //消費者線程 48 void* consume(void *arg){ 49 list_t tmp; 50 while(1){ 51 //加鎖 52 pthread_mutex_lock(&mutex); 53 if(head==NULL){ 54 //阻塞等待生產者生產 55 pthread_cond_wait(&cond,&mutex);//解鎖 等待 重新獲取鎖 56 } 57 tmp=head; 58 head=head->next; 59 //解鎖 60 pthread_mutex_unlock(&mutex); 61 //消費 62 printf("c:%d\n",tmp->data); 63 free(tmp); 64 tmp=NULL; 65 66 sleep(rand()%5+1); 67 } 68 } 69 70 int main(){ 71 srand(time(NULL)); 72 pthread_t pid,cid; 73 //創建兩個線程 pid生產者;cid消費者 74 pthread_create(&pid,NULL,product,NULL); 75 pthread_create(&cid,NULL,consume,NULL); 76 77 //阻塞等待線程匯合 78 pthread_join(pid,NULL); 79 pthread_join(cid,NULL); 80 //銷毀mutex鎖 81 pthread_mutex_destroy(&mutex); 82 //銷毀條件變量 83 pthread_cond_destroy(&cond); 84 85 return 0; 86 }

生產者和消費者問題(1)