编写程序,使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生成产品放入缓冲区,消费者不断从缓冲区中取出产品,消费产品。
时间: 2024-03-11 14:49:14 浏览: 24
好的,这是一个典型的生产者-消费者问题,可以使用信号量机制来实现同步和互斥。
以下是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10 // 缓冲区大小
#define PRODUCER_NUM 1 // 生产者数量
#define CONSUMER_NUM 1 // 消费者数量
sem_t empty; // 空缓冲区信号量
sem_t full; // 满缓冲区信号量
sem_t mutex; // 互斥信号量
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 生产者放置产品的位置
int out = 0; // 消费者取产品的位置
void *producer(void *arg) {
int id = *(int*)arg;
while (1) {
usleep(rand() % 1000000); // 模拟生产时间
sem_wait(&empty); // 等待空缓冲区
sem_wait(&mutex); // 互斥访问缓冲区
buffer[in] = rand() % 1000; // 生产产品
printf("Producer %d produced %d\n", id, buffer[in]);
in = (in + 1) % BUFFER_SIZE; // 更新生产者放置产品的位置
sem_post(&mutex); // 释放互斥信号量
sem_post(&full); // 通知满缓冲区
}
}
void *consumer(void *arg) {
int id = *(int*)arg;
while (1) {
usleep(rand() % 1000000); // 模拟消费时间
sem_wait(&full); // 等待满缓冲区
sem_wait(&mutex); // 互斥访问缓冲区
int product = buffer[out]; // 取出产品
printf("Consumer %d consumed %d\n", id, product);
out = (out + 1) % BUFFER_SIZE; // 更新消费者取产品的位置
sem_post(&mutex); // 释放互斥信号量
sem_post(&empty); // 通知空缓冲区
}
}
int main() {
sem_init(&empty, 0, BUFFER_SIZE); // 初始化空缓冲区信号量
sem_init(&full, 0, 0); // 初始化满缓冲区信号量
sem_init(&mutex, 0, 1); // 初始化互斥信号量
pthread_t producer_threads[PRODUCER_NUM];
pthread_t consumer_threads[CONSUMER_NUM];
int producer_ids[PRODUCER_NUM];
int consumer_ids[CONSUMER_NUM];
for (int i = 0; i < PRODUCER_NUM; i++) {
producer_ids[i] = i + 1;
pthread_create(&producer_threads[i], NULL, producer, &producer_ids[i]);
}
for (int i = 0; i < CONSUMER_NUM; i++) {
consumer_ids[i] = i + 1;
pthread_create(&consumer_threads[i], NULL, consumer, &consumer_ids[i]);
}
for (int i = 0; i < PRODUCER_NUM; i++) {
pthread_join(producer_threads[i], NULL);
}
for (int i = 0; i < CONSUMER_NUM; i++) {
pthread_join(consumer_threads[i], NULL);
}
sem_destroy(&empty); // 销毁信号量
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
在这个程序中,我们使用了三个信号量来实现同步和互斥:
- `empty`:表示空缓冲区,初始值为 `BUFFER_SIZE`,每个生产者生产一个产品时会将其减一,当其值为零时,生产者需要等待;
- `full`:表示满缓冲区,初始值为 0,每个消费者消费一个产品时会将其加一,当其值为 `BUFFER_SIZE` 时,消费者需要等待;
- `mutex`:表示互斥,初始值为 1,每个生产者和消费者在访问缓冲区时需要获取该信号量,表示当前只有一个生产者或消费者能够访问缓冲区。
每个生产者线程不断循环,等待空缓冲区信号量,然后等待互斥信号量,生产一个产品并放置到缓冲区中,更新自己放置产品的位置,释放互斥信号量,通知满缓冲区信号量。
每个消费者线程也不断循环,等待满缓冲区信号量,然后等待互斥信号量,从缓冲区中取出一个产品,更新自己取产品的位置,释放互斥信号量,通知空缓冲区信号量。
最后,我们使用 `pthread_create()` 函数创建生产者和消费者线程,使用 `pthread_join()` 函数等待线程结束,使用 `sem_destroy()` 函数销毁信号量。
阅读全文