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导入进去就好了。
posted @ 2014-11-11 21:38  Fighting_frank  阅读(2624)  评论(0编辑  收藏  举报