生产者消费者问题c++
时间: 2023-08-03 17:36:45 浏览: 103
生产者消费者问题是一个经典的多线程同步问题,常用于描述生产者和消费者之间的关系。以下是在C++中解决生产者消费者问题的代码示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::queue<int> data_queue; // 生产者和消费者共享的数据队列
std::mutex data_mutex; // 保护数据队列的互斥量
std::condition_variable data_cond; // 用于线程间通信的条件变量
void producer() {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(data_mutex); // 获取互斥锁
data_queue.push(i); // 生产数据
std::cout << "Produced: " << i << std::endl;
lock.unlock(); // 释放互斥锁
data_cond.notify_one(); // 通知消费者线程
}
}
void consumer() {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(data_mutex); // 获取互斥锁
data_cond.wait(lock, []{ return !data_queue.empty(); }); // 等待条件变量
int data = data_queue.front(); // 消费数据
data_queue.pop();
std::cout << "Consumed: " << data << std::endl;
lock.unlock(); // 释放互斥锁
}
}
int main() {
std::thread producer_thread(producer); // 创建生产者线程
std::thread consumer_thread(consumer); // 创建消费者线程
producer_thread.join(); // 等待生产者线程执行完毕
consumer_thread.join(); // 等待消费者线程执行完毕
return 0;
}
```
在上面的代码中,我们定义了一个数据队列`data_queue`,用于存储生产者生产的数据。生产者线程使用互斥锁和条件变量来保护和通知数据队列,当生产者生产完数据后,会将其加入数据队列,并通知消费者线程。消费者线程也使用互斥锁和条件变量来保护和等待数据队列,当消费者发现数据队列不为空时,会消费队首的数据,然后继续等待。在`main`函数中,我们创建了生产者和消费者线程,并等待它们执行完毕。
阅读全文