编写程序,使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生成产品放入缓冲区,消费者不断从缓冲区中取出产品,消费产品。 (必做)实现一次存取即可;缓冲区可以只放一个物品(例如一个字符串); (选做)实现多次存取;缓冲区可以放多个物品。
时间: 2024-03-26 22:35:29 浏览: 58
好的,我会为您解答该问题。
生产者-消费者问题是一种经典的同步问题,通过信号量机制可以很好地解决该问题。
以下是一次存取的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 1
char buffer[BUFFER_SIZE];
sem_t empty, full, mutex;
void *producer(void *arg) {
while (1) {
sem_wait(&empty); // 等待缓冲区空闲
sem_wait(&mutex); // 获取互斥锁
buffer[0] = 'a'; // 生产产品
printf("Producer produced: %c\n", buffer[0]);
sem_post(&mutex); // 释放互斥锁
sem_post(&full); // 发送信号通知消费者
sleep(1);
}
}
void *consumer(void *arg) {
while (1) {
sem_wait(&full); // 等待缓冲区有产品
sem_wait(&mutex); // 获取互斥锁
printf("Consumer consumed: %c\n", buffer[0]); // 消费产品
buffer[0] = '\0'; // 清空缓冲区
sem_post(&mutex); // 释放互斥锁
sem_post(&empty); // 发送信号通知生产者
sleep(1);
}
}
int main() {
sem_init(&empty, 0, BUFFER_SIZE); // 初始化信号量
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL); // 创建生产者线程
pthread_create(&consumer_thread, NULL, consumer, NULL); // 创建消费者线程
pthread_join(producer_thread, NULL); // 等待生产者线程结束
pthread_join(consumer_thread, NULL); // 等待消费者线程结束
sem_destroy(&empty); // 销毁信号量
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
以上代码中,使用了三个信号量:empty、full、mutex。其中,empty表示缓冲区空闲的数量,full表示缓冲区中产品的数量,mutex表示互斥锁。
在生产者线程中,先等待empty信号量,直到缓冲区空闲,然后获取互斥锁,生产产品并输出,释放互斥锁,最后发送full信号量通知消费者。
在消费者线程中,先等待full信号量,直到缓冲区中有产品,然后获取互斥锁,消费产品并输出,清空缓冲区,释放互斥锁,最后发送empty信号量通知生产者。
以上就是一次存取的实现。如果要实现多次存取,只需要在生产者线程和消费者线程中添加循环即可。如果要实现缓冲区可以放多个物品,只需要将BUFFER_SIZE设置为需要的值即可。
阅读全文