生产者消费者问题代码C++
时间: 2024-12-07 20:13:25 浏览: 29
生产者消费者问题是一个经典的并发编程示例,它涉及两个线程:生产者和消费者。生产者负责生成数据并将其放入共享资源(如队列),而消费者则从这个资源中取出数据进行处理。下面是一个简单的 C++ 实现:
```cpp
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<int> buffer;
std::mutex mtx; // 互斥锁
std::condition_variable cv_prod, cv_cons;
// 生产者函数
void producer(int n) {
for (int i = 0; i < n; ++i) {
std::unique_lock<std::mutex> lock(mtx);
cv_prod.wait(lock, []{ return !buffer.empty() || !cv_prod.notify_one(); }); // 等待缓冲区非空
buffer.push(i); // 生产元素
std::cout << "Produced: " << i << '\n';
lock.unlock();
cv_cons.notify_one(); // 唤醒消费者
}
}
// 消费者函数
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv_cons.wait(lock, []{ return !buffer.empty(); }); // 等待缓冲区有数据
int data;
if (buffer.empty()) { // 防止死锁,检查空队列
break;
}
data = buffer.front();
buffer.pop();
std::cout << "Consumed: " << data << '\n';
lock.unlock();
}
}
int main() {
std::thread producer_thread(producer, 10);
std::thread consumer_thread(consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在这个例子中,我们使用了 `std::queue`、`std::mutex` 和 `std::condition_variable` 来管理同步。生产者和消费者通过互斥锁保护共享资源,并使用条件变量保证在队列非空时唤醒等待的对方。
阅读全文