C语言编程实现生产者消费者问题
时间: 2024-10-22 20:02:04 浏览: 23
生产者消费者问题是经典的并发控制问题,在C语言中通常通过互斥量(mutex)、信号量(semaphore)和条件变量(condition variable)等同步机制来解决。这个问题涉及两个角色:生产者和消费者,他们共享一个缓冲区。
1. **生产者**:生产者负责生成数据并放入缓冲区。它需要获取到生产权限(通常是加锁操作),然后产生数据并增加缓冲区的计数,最后释放锁。
```c
void producer(int *buffer, int size, sem_t *full, sem_t *mutex) {
while (true) {
// 获取缓冲区满的信号
sem_wait(full);
// 加锁
sem_wait(mutex);
// 生产数据
buffer[buffer_index] = generate_data();
buffer_index++;
if (buffer_index == size) { // 缓冲区满
buffer_index = 0; // 循环回第一位置
}
// 通知消费者缓冲区有空了
sem_post(mutex); // 释放锁
}
}
```
2. **消费者**:消费者从缓冲区取出数据并消费。它首先获取缓冲区空的信号,然后尝试获取锁。如果成功,检查缓冲区是否为空,若非空则取出数据并减少计数,最后释放锁。
```c
void consumer(int *buffer, int size, sem_t *empty, sem_t *mutex) {
while (true) {
// 获取缓冲区空的信号
sem_wait(empty);
// 加锁
sem_wait(mutex);
if (buffer_index != 0) { // 存储有数据
consume_data(buffer[buffer_index]);
buffer_index--;
} else { // 缓冲区为空
sem_post(empty); // 通知生产者可以填入
}
// 释放锁
sem_post(mutex);
}
}
```
阅读全文