您的位置:首页 > 其它

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

2016-04-26 22:29 423 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: