编写程序,使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生成产品放入缓冲区,消费者不断从缓冲区中取出产品,消费产品。
时间: 2023-06-18 21:07:07 浏览: 111
以下是一个使用信号量机制模拟生产者-消费者问题的简单示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
sem_t empty;
sem_t full;
sem_t mutex;
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 100; // 随机生成一个产品
sem_wait(&empty); // 等待缓冲区非满
sem_wait(&mutex); // 互斥访问缓冲区
buffer[in] = item; // 将产品放入缓冲区
printf("Producer produced item %d at position %d\n", item, in);
in = (in + 1) % BUFFER_SIZE; // 更新缓冲区指针
sem_post(&mutex); // 释放缓冲区
sem_post(&full); // 通知缓冲区非空
sleep(rand() % 3); // 生产者休息一段时间
}
}
void *consumer(void *arg) {
int item;
while (1) {
sem_wait(&full); // 等待缓冲区非空
sem_wait(&mutex); // 互斥访问缓冲区
item = buffer[out]; // 从缓冲区取出产品
printf("Consumer consumed item %d at position %d\n", item, out);
out = (out + 1) % BUFFER_SIZE; // 更新缓冲区指针
sem_post(&mutex); // 释放缓冲区
sem_post(&empty); // 通知缓冲区非满
sleep(rand() % 3); // 消费者休息一段时间
}
}
int main() {
pthread_t p, c;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_create(&p, NULL, producer, NULL);
pthread_create(&c, NULL, consumer, NULL);
pthread_join(p, NULL);
pthread_join(c, NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
该程序先定义了一个缓冲区和两个指针 `in` 和 `out`,表示下一个可用位置和下一个待消费位置。
生产者线程不断生成产品并放入缓冲区中,如果缓冲区已满则等待,如果缓冲区非满则将产品放入缓冲区中,并更新指针。消费者线程不断从缓冲区中取出产品并消费,如果缓冲区为空则等待,如果缓冲区非空则从缓冲区中取出产品并更新指针。
为了实现互斥访问缓冲区,使用了一个互斥信号量 `mutex`。为了实现等待缓冲区非满和非空,分别使用了两个信号量 `empty` 和 `full`。其中,`empty` 的初始值为缓冲区的大小,表示缓冲区最开始是空的,`full` 的初始值为 0,表示缓冲区最开始是空的。
程序中的 `rand()` 函数用于随机生成产品和休息时间,以模拟生产者和消费者的行为。
在程序运行结束后,使用 `sem_destroy()` 函数释放信号量资源。
阅读全文