解释并提供一个关于生产者消费者问题(Producer-Consumer Problem)的经典C语言实现示例。
时间: 2024-12-22 17:24:05 浏览: 10
生产者消费者问题是一个经典的并发控制问题,通常涉及两个线程:生产者和消费者。生产者负责生产数据放入共享资源(如队列),而消费者负责从这个资源中取出数据并消费。这种模式解决了资源竞争的问题,避免了死锁。
下面是一个简单的C语言版本,使用`semaphore`库(假设已经包含了sem.h)来管理生产者的插入和消费者的取出操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define MAX_BUFFER_SIZE 10
typedef struct {
int buffer[MAX_BUFFER_SIZE];
int count;
int in;
int out;
} Buffer;
void producer(Buffer *buffer, sem_t *empty, sem_t *full) {
for (;;) {
sem_wait(empty); // 等待缓冲区空闲
buffer->buffer[buffer->in] = rand(); // 生产数据
buffer->count++;
buffer->in = (buffer->in + 1) % MAX_BUFFER_SIZE; // 循环数组
sem_post(full); // 通知消费者缓冲区已满
}
}
void consumer(Buffer *buffer, sem_t *empty, sem_t *full) {
for (;;) {
sem_wait(full); // 等待缓冲区满
printf("Consuming: %d\n", buffer->buffer[buffer->out]);
buffer->count--;
buffer->out = (buffer->out + 1) % MAX_BUFFER_SIZE; // 循环数组
sem_post(empty); // 通知生产者缓冲区已被消费
}
}
int main() {
Buffer buffer;
sem_t empty = SEM uninitialized, full = SEM uninitialized;
init_sem(&empty, 0);
init_sem(&full, MAX_BUFFER_SIZE);
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, &buffer, &empty, &full);
pthread_create(&consumer_thread, NULL, consumer, &buffer, &empty, &full);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
在这个例子中,`empty`信号量用于表示缓冲区为空,`full`信号量表示缓冲区满。当生产者看到`empty`为0时,知道可以添加数据;同样,消费者在`full`为MAX_BUFFER_SIZE时开始消费。这需要对这两个信号量进行同步操作。
阅读全文