如何用C++实现经典的生产者消费者问题?
时间: 2024-10-22 21:14:24 浏览: 10
在C++中,可以使用互斥量(mutex)、条件变量(condition_variable)和队列(queue)来实现经典生产者消费者问题。这是一个线程同步的经典示例,其中生产者线程负责生产数据放入队列,消费者线程则从队列中取出并处理数据。
以下是简化的C++代码实现:
```cpp
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> data_queue;
std::mutex mtx; // 互斥锁
std::condition_variable cond; // 条件变量
// 生产者函数
void producer(int n) {
for (int i = 0; i < n; ++i) {
std::unique_lock<std::mutex> lck(mtx);
// 生产数据并通知消费者
data_queue.push(i);
std::cout << "Produced: " << i << "\n";
cond.notify_one(); // 醒醒消费者
lck.unlock();
// 线程睡眠一段时间模拟工作
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
// 消费者函数
void consumer() {
while (true) {
std::unique_lock<std::mutex> lck(mtx);
// 如果队列为空,等待数据
if (data_queue.empty()) {
cond.wait(lck); // 当队列有数据时唤醒
} else {
int val = data_queue.front();
data_queue.pop();
std::cout << "Consumed: " << val << "\n";
lck.unlock();
}
}
}
int main() {
std::thread producer_thread(producer, 10); // 创建生产者线程
std::thread consumer_thread(consumer); // 创建消费者线程
producer_thread.join(); // 等待生产者结束
consumer_thread.join(); // 等待消费者结束
return 0;
}
```
阅读全文