【问题描述】 有1 个生产者和1 个消费者,至多有10 个商品可以生产,利用信号量对空缓冲区和满缓冲区进行表示。假设生产者和消费者权限相等,只有缓冲区未满,生产者可生成商品放入缓冲池,只要缓冲池未空,消费者则可消费商品。 用C语言写出代码和伪代码
时间: 2024-06-20 11:02:57 浏览: 60
使用信号量实现有限缓冲区的生产者和消费者问题
5星 · 资源好评率100%
以下是该问题的C语言实现和伪代码:
C语言代码:
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX 10 // 缓冲区大小
int buffer[MAX]; // 缓冲区
int fill = 0; // 生产者填充缓冲区的位置
int use = 0; // 消费者使用缓冲区的位置
sem_t empty; // 空缓冲区信号量
sem_t full; // 满缓冲区信号量
pthread_mutex_t mutex; // 互斥锁
void put(int value) {
buffer[fill] = value;
fill = (fill + 1) % MAX;
}
int get() {
int tmp = buffer[use];
use = (use + 1) % MAX;
return tmp;
}
void *producer(void *arg) {
int i;
for (i = 0; i < 20; i++) {
sem_wait(&empty); // 等待空缓冲区
pthread_mutex_lock(&mutex); // 加锁
put(i);
printf("生产者生产:%d\n", i);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&full); // 发送满缓冲区信号
}
return NULL;
}
void *consumer(void *arg) {
int i, tmp = 0;
while (tmp != -1) {
sem_wait(&full); // 等待满缓冲区
pthread_mutex_lock(&mutex); // 加锁
tmp = get();
printf("消费者消费:%d\n", tmp);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&empty); // 发送空缓冲区信号
}
return NULL;
}
int main() {
sem_init(&empty, 0, MAX); // 初始化空缓冲区信号量为MAX
sem_init(&full, 0, 0); // 初始化满缓冲区信号量为0
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
pthread_t producer_id, consumer_id;
pthread_create(&producer_id, NULL, producer, NULL);
pthread_create(&consumer_id, NULL, consumer, NULL);
pthread_join(producer_id, NULL);
pthread_join(consumer_id, NULL);
pthread_mutex_destroy(&mutex); // 销毁互斥锁
sem_destroy(&empty); // 销毁空缓冲区信号量
sem_destroy(&full); // 销毁满缓冲区信号量
return 0;
}
```
伪代码:
```
生产者线程:
repeat
生产产品;
等待空缓冲区;
加锁;
将产品放入缓冲区;
解锁;
发送满缓冲区信号;
until 生产完毕
消费者线程:
repeat
等待满缓冲区;
加锁;
从缓冲区取出产品;
解锁;
发送空缓冲区信号;
消费产品;
until 消费完毕
主函数:
初始化信号量和互斥锁;
创建生产者线程和消费者线程;
等待生产者线程和消费者线程结束;
销毁信号量和互斥锁。
```
阅读全文