请介绍生产者消费者设计模式,并使用C++示例程序加上注释讲解
时间: 2024-05-10 22:20:33 浏览: 107
生产者消费者设计模式是一种常用的多线程设计模式,它用于解决生产者和消费者之间的数据交互问题。在这种模式中,生产者负责生产数据并将其放入共享队列中,而消费者则负责从队列中取出数据并进行处理。这种设计模式可以有效地实现数据的异步传输和处理,提高系统的并发性和吞吐量。
下面是一个使用C语言实现的生产者消费者示例程序,其中包括了详细的注释解释各个部分的作用和原理:
```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;
while (1) {
item = rand() % 100; // 随机生成一个数据项
// 获取互斥锁,保证对共享队列的操作是原子性的
pthread_mutex_lock(&mutex);
// 如果队列已经满了,则等待条件变量的信号
while (count == BUFFER_SIZE) {
pthread_cond_wait(&cond, &mutex);
}
buffer[count] = item; // 将数据项放入共享队列中
count++; // 增加队列中元素的数量
// 发送条件变量的信号,通知消费者线程可以从队列中取出数据
pthread_cond_signal(&cond);
// 释放互斥锁
pthread_mutex_unlock(&mutex);
printf("Producer produced %d\n", item); // 打印生产者生产的数据项
}
pthread_exit(NULL);
}
// 消费者线程函数
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--; // 减少队列中元素的数量
// 发送条件变量的信号,通知生产者线程可以向队列中放入数据
pthread_cond_signal(&cond);
// 释放互斥锁
pthread_mutex_unlock(&mutex);
printf("Consumer consumed %d\n", item); // 打印消费者消费的数据项
}
pthread_exit(NULL);
}
int main() {
pthread_t producer_thread, consumer_thread;
// 创建生产者线程和消费者线程
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
// 等待线程结束
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
在上面的示例程序中,生产者线程和消费者线程共享一个固定大小的队列缓冲区,通过互斥锁和条件变量实现对队列的互斥访问和同步操作。生产者线程随机生成一个数据项,并将其放入共享队列中,然后发送条件变量的信号通知消费者线程可以从队列中取出数据。消费者线程从队列中取出一个数据项,并发送条件变量的信号通知生产者线程可以向队列中放入数据。这样,生产者和消费者之间就可以实现同步和互斥操作,避免了数据竞争和死锁等问题。
阅读全文