posix下定义了一个semaphore,他和systemV版本下的sem很像,而这个多用于线程,它的单位是信号量,而sem的单位是信号量集。

 #include <semaphore.h>

 int sem_init(sem_t *sem, int pshared, unsigned int value);
 int sem_destroy(sem_t *sem);
 int sem_wait(sem_t *sem);
 int sem_trywait(sem_t *sem);
 int sem_post(sem_t *sem);

其中wait就是P操作,post则是V操作。


环形BUFF的设计思想:

    用一个大小为BUFF_MAX的数组,生产者在前,消费者在后,生产者的pro_sem初始化BUFF_MAX,

消费者cons_sem初始化为0,生产者生产则pro_sem执行p操作cons_sem执行V操作,反之消费者消费cons_sem-1,而pro_sem+1,数组下表%BUFF_MAX这样数组就相当于一个环形BUUF了。


  1 #include<stdio.h>
  2 #include<semaphore.h>
  3 #include<pthread.h>
  4 #define PRO_BUFF 20
  5 #define CONS_BUFF 0
  6 int my_buff[PRO_BUFF];
  7 sem_t productor_sem;
  8 sem_t consumer_sem;
  9 sem_t cons_comm;
 10 sem_t pro_comm;
 11 
 12 void*productor(void *arg)
 13 {
 14     pthread_detach(pthread_self());
 15     int p=0;
 16     while(1)
 17     {
 18         sem_wait(&productor_sem);
 19         sem_wait(&pro_comm);
 20         int value=rand()%100;
 21         my_buff[p]=value;
 22         printf("productor%dalready :%d\n",(int)arg,value);
 23         sem_post(&pro_comm);
 24         sem_post(&consumer_sem);
 25         p=(p+1)%PRO_BUFF;
 26         sleep(rand()%3);
 27     }
 28 }
 29 void*consumer(void *arg)
 30 {
 31     pthread_detach(pthread_self());
 32     int c=0;
 33     while(1)
 34     {
 35         sem_wait(&consumer_sem);
 36         sem_wait(&cons_comm);
 37         int value=my_buff[c];
 38         printf("consumer%dreceive value :%d\n",(int)arg,value);
 39         sem_post(&cons_comm);
 40         sem_post(&productor_sem);
 41         c=(c+1)%PRO_BUFF;
 42         sleep(rand()%5);
 43     }
 44 
 45 }
 46 
 47 
 48 int main()
 49 {
 50     sem_init(&productor_sem,0,PRO_BUFF);
 51     sem_init(&consumer_sem,0,CONS_BUFF);
 52     sem_init(&cons_comm,0,1);
 53     sem_init(&pro_comm,0,1);
 54     pthread_t productor1_id;
 55     pthread_t consumer1_id;
 56     int i;
 57     for(i=1;i<4;i++)
 58     {
 59         pthread_create(&productor1_id,NULL,productor,(void*)i);
 60 
 61     }
 62     for(i=1;i<4;i++)
 63     {
 64         pthread_create(&consumer1_id,NULL,consumer,(void*)i);
 65     }
 66     pthread_join(productor1_id,NULL);
 67     pthread_join(consumer1_id,NULL);
 68 }

在消费者和消费者之间添加一把锁,生产者生产者之间添加一把锁,目的是为了它们之间的互斥关系。