互斥模型
同步模型
生产者消费者其实是用了两种模型,就是先同步再互斥,就是首先要先由生产者生产产品,后面消费者才能消费产品,同时生产和消费这个过程是要互斥的。
1 #include<semaphore.h> 2 #include<pthread.h> 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<unistd.h> 6 #include<string.h> 7 8 #define N 10 9 10 typedef struct product 11 { 12 char name; 13 }product; 14 15 product p1[N]; 16 17 sem_t mutex; 18 sem_t synch1; 19 sem_t synch2; 20 21 int count = 0; 22 23 void *produce_item(void *arg) 24 { 25 char ch = 'a'; 26 while (1) 27 { 28 printf("生产者生产一个产品 "); 29 sem_wait(&synch1); 30 sem_wait(&mutex); 31 p1[count].name= ch; 32 sleep(1); 33 printf("------------------ "); 34 printf("%c产品已入库 ",ch); 35 ch++; 36 count++; 37 printf("产品个数%d ",count); 38 printf("------------------ "); 39 sem_post(&mutex); 40 sem_post(&synch2); 41 sleep(1); 42 } 43 } 44 45 void *custom_item(void *arg) 46 { 47 sleep(5); 48 while (1) 49 { 50 sem_wait(&synch2); 51 sem_wait(&mutex); 52 count--; 53 printf("消费者消费一个产品 "); 54 printf("产品个数%d ",count); 55 sem_post(&mutex); 56 sem_post(&synch1); 57 sleep(2); 58 } 59 60 } 61 int main(int argc, char const *argv[]) 62 { 63 pthread_t producer; 64 pthread_t customer; 65 if(sem_init(&mutex,0,1) == -1) 66 { 67 perror("sem_init mutex"); 68 exit(1); 69 } 70 if(sem_init(&synch1,0,N) == -1) 71 { 72 perror("sem_init synch1"); 73 exit(1); 74 } 75 if(sem_init(&synch2,0,0) == -1) 76 { 77 perror("sem_init stnch2"); 78 exit(1); 79 } 80 if(pthread_create(&producer,NULL,produce_item,NULL) != 0) 81 { 82 perror("pthread_create producer"); 83 exit(1); 84 } 85 if(pthread_create(&customer,NULL,custom_item,NULL) == -1) 86 { 87 perror("pthread_create custom"); 88 exit(1); 89 } 90 pthread_join(producer,NULL); 91 pthread_join(customer,NULL); 92 sem_destroy(&mutex); 93 sem_destroy(&synch1); 94 sem_destroy(&synch2); 95 return 0; 96 }
运行结果: