信号量实现环形buff下多生产者多消费者模型

来源:互联网 发布:用友政务软件报价 编辑:程序博客网 时间:2024/05/16 15:56

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 }

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


本文出自 “痕迹” 博客,请务必保留此出处http://wpfbcr.blog.51cto.com/10696766/1768062

0 0