用c++编写生产者消费者问题
时间: 2023-06-05 21:05:27 浏览: 124
基于C++实现生产者消费者问题(操作系统课程作业)【100012254】
5星 · 资源好评率100%
好的,生产者消费者问题是一个经典的多线程同步问题,可以通过信号量、条件变量等方式来实现。以下是用C语言编写的生产者消费者问题代码示例:
```
#include <stdio.h>
#include <pthread.h>
#define MAX_SIZE 10 // 缓冲区的最大大小
#define PRODUCER_NUM 2 // 生产者线程的数量
#define CONSUMER_NUM 2 // 消费者线程的数量
#define MAX_ITEM 100 // 生产者生产的最大数量
int buffer[MAX_SIZE]; // 缓冲区
int in = 0; // 生产者放置数据的位置
int out = 0; // 消费者取走数据的位置
int count = 0; // 缓冲区中的元素数量
pthread_mutex_t mutex; // 互斥锁,保护缓冲区和count
pthread_cond_t not_full; // 条件变量,表示缓冲区非满
pthread_cond_t not_empty; // 条件变量,表示缓冲区非空
void *producer(void *arg) {
int i, item;
for (i = 0; i < MAX_ITEM; i++) {
item = i;
// 获取互斥锁
pthread_mutex_lock(&mutex);
// 如果缓冲区已满,等待条件变量not_full
while (count == MAX_SIZE) {
pthread_cond_wait(¬_full, &mutex);
}
// 将数据放入缓冲区
buffer[in] = item;
in = (in + 1) % MAX_SIZE;
count++;
// 通知条件变量not_empty
pthread_cond_signal(¬_empty);
// 释放互斥锁
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < MAX_ITEM; i++) {
// 获取互斥锁
pthread_mutex_lock(&mutex);
// 如果缓冲区为空,等待条件变量not_empty
while (count == 0) {
pthread_cond_wait(¬_empty, &mutex);
}
// 从缓冲区取出一个数据
item = buffer[out];
out = (out + 1) % MAX_SIZE;
count--;
// 通知条件变量not_full
pthread_cond_signal(¬_full);
// 释放互斥锁
pthread_mutex_unlock(&mutex);
// 处理数据
printf("Thread %ld: item = %d\n", (long)arg, item);
}
return NULL;
}
int main() {
pthread_t threads[PRODUCER_NUM + CONSUMER_NUM];
int i;
// 初始化互斥锁和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(¬_full, NULL);
pthread_cond_init(¬_empty, NULL);
// 创建生产者线程
for (i = 0; i < PRODUCER_NUM; i++) {
pthread_create(&threads[i], NULL, producer, NULL);
}
// 创建消费者线程
for (i = 0; i < CONSUMER_NUM; i++) {
pthread_create(&threads[PRODUCER_NUM + i], NULL, consumer, (void *)(long)(i + 1));
}
// 等待线程结束
for (i = 0; i < PRODUCER_NUM + CONSUMER_NUM; i++) {
pthread_join(threads[i], NULL);
}
// 销毁互斥锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(¬_full);
pthread_cond_destroy(¬_empty);
return 0;
}
```
这个示例中,我们使用了一个固定大小的缓冲区来实现生产者消费者问题,生产者线程将数据放入缓冲区,消费者线程从缓冲区取出数据并进行处理。使用互斥锁和条件变量来实现线程同步。
阅读全文