生产者消费者问题c++实验结果
时间: 2023-11-03 07:05:54 浏览: 114
生产者消费者问题是一个经典的同步问题,主要用于描述多线程之间的互斥与同步问题。在该问题中,有若干个生产者线程和消费者线程,它们共用一个有限缓冲区。生产者线程负责向缓冲区中生产数据,而消费者线程则负责从缓冲区中消费数据。为了保证生产者与消费者线程之间的协作,需要使用互斥锁、条件变量等同步机制。
下面是一个基于C++语言实现的生产者消费者问题的程序,该程序使用了互斥锁与条件变量实现同步与互斥。
```
#include <iostream>
#include <queue>
#include <pthread.h>
using namespace std;
#define MAX_BUFFER_SIZE 10
queue<int> buffer; // 缓冲区队列
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t cond; // 条件变量
void* producer(void* arg) {
while (true) {
pthread_mutex_lock(&mutex);
while (buffer.size() == MAX_BUFFER_SIZE) { // 缓冲区已满,等待消费者消费
pthread_cond_wait(&cond, &mutex);
}
int data = rand();
buffer.push(data);
cout << "Producer produced data: " << data << endl;
pthread_cond_signal(&cond); // 通知消费者可以消费
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* consumer(void* arg) {
while (true) {
pthread_mutex_lock(&mutex);
while (buffer.empty()) { // 缓冲区为空,等待生产者生产
pthread_cond_wait(&cond, &mutex);
}
int data = buffer.front();
buffer.pop();
cout << "Consumer consumed data: " << data << endl;
pthread_cond_signal(&cond); // 通知生产者可以生产
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t producer_tid, consumer_tid;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&producer_tid, NULL, producer, NULL);
pthread_create(&consumer_tid, NULL, consumer, NULL);
pthread_join(producer_tid, NULL);
pthread_join(consumer_tid, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
```
该程序中,生产者线程和消费者线程通过互斥锁和条件变量实现了同步与互斥。当缓冲区已满时,生产者线程会等待消费者线程消费后再生产;当缓冲区为空时,消费者线程会等待生产者线程生产后再消费。由于互斥锁的存在,生产者和消费者线程之间的操作是互斥的,不会发生竞争条件的问题。同时,通过条件变量的使用,生产者和消费者线程之间的通信也得到了良好的保障。
该程序可以通过编译并运行,得到生产者和消费者线程之间的交互结果。
阅读全文