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 }
在消费者和消费者之间添加一把锁,生产者生产者之间添加一把锁,目的是为了它们之间的互斥关系。
转载于:https://blog.51cto.com/wpfbcr/1768062