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 }
在消费者和消费者之间添加一把锁,生产者生产者之间添加一把锁,目的是为了它们之间的互斥关系。
时间: 2024-12-14 11:26:24