用C语言实现生产者-消费者问题。假设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生产产品并存入缓冲区,消费者不断从缓冲区中取出产品并消费。并解释每行代码的意思。
时间: 2024-05-14 20:11:45 浏览: 90
好的,我了解了您的要求。关于您的问题,我可以给出以下实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0; // 计数器,表示缓冲区当前产品数量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
int item = 0;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
// 检查缓冲区是否已满,若已满则阻塞等待消费者消费
while (count == BUFFER_SIZE) {
pthread_cond_wait(&cond, &mutex);
}
// 生产产品并存入缓冲区
item++;
buffer[count] = item;
count++;
printf("producer: produce item %d, total %d items\n", item, count);
pthread_cond_signal(&cond); // 唤醒消费者
pthread_mutex_unlock(&mutex); // 解锁
}
}
void *consumer(void *arg) {
int item;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
// 检查缓冲区是否已空,若已空则阻塞等待生产者生产
while (count == 0) {
pthread_cond_wait(&cond, &mutex);
}
// 从缓冲区中取出一个产品并消费
item = buffer[count-1];
count--;
printf("consumer: consume item %d, total %d items\n", item, count);
pthread_cond_signal(&cond); // 唤醒生产者
pthread_mutex_unlock(&mutex); // 解锁
}
}
int main() {
pthread_t tid_producer, tid_consumer;
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
return 0;
}
```
以上的代码实现了一个生产者-消费者模型,其中包括一个生产者和一个消费者,借助一个缓冲区实现生产和消费的同步。
其中,线程函数 `producer` 是生产者函数,线程函数 `consumer` 是消费者函数。
计数器 `count` 表示缓冲区中当前产品数量。
互斥锁 `mutex` 和条件变量 `cond` 用于同步生产者和消费者的操作。
在生产者函数中,线程首先会加锁,然后检查缓冲区是否已满,若已满则阻塞等待消费者消费。如果缓冲区未满,则生产一件产品并存入缓冲区,然后释放锁并唤醒消费者。
在消费者函数中,线程首先会加锁,然后检查缓冲区是否为空,若已空则阻塞等待生产者生产。如果缓冲区不为空,则从缓冲区中取出一件产品并消费,然后释放锁并唤醒生产者。
最后,主函数通过创建线程并等待线程结束来启动生产者和消费者线程,完成生产者-消费者模型的运行。
阅读全文