-
Notifications
You must be signed in to change notification settings - Fork 14
/
producer-consumer.c
98 lines (83 loc) · 2.1 KB
/
producer-consumer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define N1 3 // 生产者
#define N2 4 // 消费者
#define N 10 // 缓存区大小
sem_t empty_sem; // 同步信号量,记录缓存区中未使用的数
sem_t full_sem; // 同步信号量,记录缓存区中已使用的数
pthread_mutex_t mutex; // 互斥信号量,实现互斥访问
int in = 0;
int out = 0;
int buff[N] = {0};
int product_id = 0;
int consumer_id = 0;
int data; // 假设数据均为 int 型数字
FILE *fp;
void *product()
{
int id = ++product_id;
while (1)
{
sleep(1);
sem_wait(&empty_sem); // 等待缓冲区有空间
pthread_mutex_lock(&mutex); // 锁定互斥信号量
if (fscanf(fp, "%d", &data) == EOF)
{
fseek(fp, 0, SEEK_SET);
fscanf(fp, "%d", &data);
}
in = in % N;
buff[in] = data;
printf("生产者 %d 生产 %d 于 %d\n", id, buff[in], in);
++in;
pthread_mutex_unlock(&mutex); // 解锁互斥信号量
sem_post(&full_sem); // 向同步信号量发送信号
}
}
void *consume()
{
int id = ++consumer_id;
while (1)
{
sleep(1);
sem_wait(&full_sem); // 等待缓冲区存有数据
pthread_mutex_lock(&mutex); // 锁定互斥信号量
out = out % N;
printf("消费者 %d 消费 %d 于 %d\n", id, buff[out], out);
buff[out] = 0;
++out;
pthread_mutex_unlock(&mutex); // 解锁互斥信号量
sem_post(&empty_sem); // 向同步信号量发送信号
}
}
int main(void)
{
pthread_t id1[N1];
pthread_t id2[N2];
// 初始化同步量和互斥量
sem_init(&empty_sem, 0, N);
sem_init(&full_sem, 0, 0);
pthread_mutex_init(&mutex, NULL);
fp = fopen("./problem_2_data", "r"); // 打开存储数据的文件
int i;
for (i = 0; i < N1; i++)
{
pthread_create(&id1[i], NULL, product, (void *)(&i));
}
for (i = 0; i < N2; i++)
{
pthread_create(&id2[i], NULL, consume, NULL);
}
for (i = 0; i < N1; i++)
{
pthread_join(id1[i], NULL);
}
for (i = 0; i < N2; i++)
{
pthread_join(id2[i], NULL);
}
return 0;
}