基于信号量与互斥锁实现的生产者和消费者

  • 信号量API
    •  #include <semaphore.h>
      2 //等待互斥量(原子操作)
      3 int sem_wait(sem_t *serm);
      4 //通知互斥量加一
      5 int sem_post(sem_t *sem);
  •  基于信号量与互斥锁实现的生产者和消费者
    •   1 #include <stdio.h>
        2 #include <stdlib.h>
        3 #include <unistd.h>
        4 #include <sys/types.h>
        5 #include <pthread.h>
        6 #include <errno.h>
        7 #include <string.h>
        8 #include <semaphore.h>
        9 
       10 #define ERR_EXIT(m)\
       11     do\
       12     {\
       13         perror(m);\
       14         exit(EXIT_FAILURE);\
       15     }while(0)\
       16 
       17 #define CONSUMER_COUNT 1
       18 #define PRODUCE_COUNT 2
       19 
       20 #define BUFFSIZE 10
       21 int g_buffer[BUFFSIZE];
       22 
       23 unsigned short in = 0;
       24 unsigned short out = 0;
       25 unsigned short produce_id = 0;
       26 unsigned short consume_id = 0;
       27 
       28 sem_t g_sem_full;
       29 sem_t g_sem_empty;
       30 
       31 pthread_mutex_t g_mutex;
       32 
       33 pthread_t g_thread[CONSUMER_COUNT+PRODUCE_COUNT];
       34 
       35 void* consume(void* arg)
       36 {
       37     int num= (int*)arg;
       38     int i;
       39     while(1)
       40     {
       41         printf("%d wait buffer not  empty\n",num);
       42         sem_wait(&g_sem_empty);
       43         pthread_mutex_lock(&g_mutex);
       44     
       45         for(i = 0; i< BUFFSIZE; i++)
       46         {
       47             printf("%02d ",i);
       48             if(g_buffer[i] == -1)
       49                 printf("%s","null");
       50             else
       51                 printf("%d",g_buffer[i]);
       52             if(i == out)
       53                 printf("\t<--consume");
       54             printf("\n");
       55         }
       56 
       57         consume_id = g_buffer[out];
       58         printf("%d begin consume product %d\n",num, consume_id);
       59         g_buffer[out] = -1;
       60         out = (out +  1)%BUFFSIZE;
       61         printf("%d end consume produce %d\n",num,consume_id); 
       62 
       63         pthread_mutex_unlock(&g_mutex);
       64         sem_post(&g_sem_full);
       65         sleep(1);
       66     }
       67     return NULL;
       68 }
       69 
       70 void* produce(void* arg)
       71 {
       72     int num = (int*)arg;
       73     int i;
       74     while(1)
       75     {
       76         printf("%d wait buffer not full\n",num);
       77         sem_wait(&g_sem_full);
       78         pthread_mutex_lock(&g_mutex);
       79     
       80         for(i = 0; i< BUFFSIZE; i++)
       81         {
       82             printf("%02d ",i);
       83             if(g_buffer[i] == -1)
       84                 printf("%s","null");
       85             else
       86                 printf("%d",g_buffer[i]);
       87             if(i == in)
       88                 printf("\t<--produce");
       89             printf("\n");
       90         }
       91 
       92         printf("%d begin produce product %d\n",num, produce_id);
       93         g_buffer[in] = produce_id;
       94         in = (in +  1)%BUFFSIZE;
       95         printf("%d end produce produce %d\n",num,produce_id++); 
       96         
       97         pthread_mutex_unlock(&g_mutex);
       98         sem_post(&g_sem_empty);
       99         sleep(1);
      100     }
      101     return NULL;
      102 }
      103 
      104 int main(void)
      105 {
      106     int i;
      107     for(i = 0; i < BUFFSIZE;i++)
      108         g_buffer[i] = -1;
      109     sem_init(&g_sem_full, 0, BUFFSIZE);
      110     sem_init(&g_sem_empty, 0, 0);
      111 
      112     pthread_mutex_init(&g_mutex,NULL);
      113 
      114     for(i = 0; i< CONSUMER_COUNT; i++)
      115     {
      116         pthread_create(&g_thread[i], NULL,consume, (void*)i);
      117     }
      118 
      119     for(i = 0; i< PRODUCE_COUNT; i++)
      120     {
      121         pthread_create(&g_thread[i], NULL,produce, (void*)i);
      122     }
      123 
      124     for(i = 0; i < CONSUMER_COUNT + PRODUCE_COUNT; i++)
      125     {
      126         pthread_join(g_thread[i],NULL);    
      127     }
      128 
      129 
      130     pthread_mutex_destroy(&g_mutex);
      131     sem_destroy(&g_sem_full);
      132     sem_destroy(&g_sem_empty);
      133 
      134 
      135     return 0;
      136 }

猜你喜欢

转载自www.cnblogs.com/zhaohu/p/9033265.html
今日推荐