C语言调用库函数实现生产者消费者问题
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<semaphore.h> 4 #include<pthread.h> 5 #include<unistd.h> 6 7 #define NumOf_Producer 5 //the max num of producer 8 #define NumOf_Consumer 10 //the max num of consumer 9 #define Maxnum 10 // the max num of product 10 sem_t Empty_sem; //the goal of whether the num of product is null 11 sem_t Full_sem; //the goal of whether the num of product is equal to Maxnum 12 13 pthread_mutex_t Mutex; //the goal of whether someone use the buff 14 15 int Producer_id = 0; 16 int Consumer_id = 0; 17 int NowNumOfProduce = 0; 18 void *Producer(void *arg) //the thread of producer 19 { 20 int id = Producer_id++; 21 while(1) 22 { 23 sleep(0.1); 24 sem_wait(&Full_sem); //when it comes to zero ,it means that the num of product is equal to Maxnum 25 pthread_mutex_lock(&Mutex); //lock the buff 26 NowNumOfProduce++; 27 printf("Producerthread %d product one,the num is:%d \n",id%NumOf_Producer,NowNumOfProduce); 28 pthread_mutex_unlock(&Mutex); 29 sem_post(&Empty_sem); //when it comes to ten ,it means there are ten products can be used by consumer 30 } 31 32 return ((void *)0); 33 } 34 35 void *Consumer(void *arg) 36 { 37 int id = Consumer_id++; 38 while(1) 39 { 40 sleep(0.2); 41 sem_wait(&Empty_sem); 42 pthread_mutex_lock(&Mutex); 43 NowNumOfProduce--; 44 printf("Consumerthread %d use product one,the num is:%d \n",id%NumOf_Consumer,NowNumOfProduce); 45 pthread_mutex_unlock(&Mutex); 46 sem_post(&Full_sem); 47 } 48 return ((void *)0); 49 } 50 51 int main() 52 { 53 pthread_t Con[NumOf_Consumer]; 54 pthread_t Pro[NumOf_Producer]; 55 56 int temp1 = sem_init(&Empty_sem,0,0); 57 int temp2 = sem_init(&Full_sem,0,Maxnum); 58 if(temp1&&temp2!=0) 59 { 60 printf("sem init failed \n"); 61 exit(1); 62 } 63 64 int temp3 = pthread_mutex_init(&Mutex,NULL); 65 66 if(temp3!=0) 67 { 68 printf("Mutex init failed \n"); 69 exit(1); 70 } 71 72 for(int i=0 ;i<NumOf_Producer;i++) 73 { 74 int temp4 = pthread_create(&Pro[i],NULL,Producer,(void *)&i); 75 if(temp4!=0) 76 { 77 printf("thread create failed !\n"); 78 exit(1); 79 } 80 } 81 82 for(int i=0;i<NumOf_Consumer;i++) 83 { 84 int temp5 = pthread_create(&Con[i],NULL,Consumer,(void *)&i); 85 if(temp5!=0) 86 { 87 printf("thread create failed !\n"); 88 } 89 exit(1); 90 } 91 //destroy the thread 92 for(int i=0;i<NumOf_Consumer;i++) 93 { 94 pthread_join(Con[i],NULL); 95 } 96 97 for(int i=0;i<NumOf_Producer;i++) 98 { 99 pthread_join(Pro[i],NULL); 100 } 101 102 return 0; 103 }
说明:unisted.h是用来调用sleep,pthread.h是linux系统下线程编程的库,semaphore.h是使用信号灯的函数库,至于那些初始化方法,wait方法,post等可以去查查的。如果在编译程序时候出现类似sem_t未定义等问题,需要设置一下link链接,找到linux系统下安装的lib库中的libpthread.so导入进去就好了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。