C++中生产者消费者问题详细代码
时间: 2024-12-12 07:19:43 浏览: 19
下面是一个简单的C++代码示例,使用`std::thread`, `std::mutex`, 和 `std::condition_variable` 实现生产者消费者问题:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
class Buffer {
public:
int capacity = 5; // 定义队列容量
std::queue<int> items;
std::mutex mtx; // 互斥锁
std::condition_variable cv_prod, cv_cons;
// 生产者函数
void producer() {
for (int i = 0; i != 10; ++i) { // 生产10个元素
std::unique_lock<std::mutex> lock(mtx);
cv_prod.wait(lock, []{return !items.empty() || !cv_prod.wait_for(lock, std::chrono::seconds(1)).Occurred();}); // 等待队列不满或1秒超时
if (!items.full()) { // 队列不满,添加元素
items.push(i);
std::cout << "Produced item: " << i << std::endl;
cv_cons.notify_one(); // 唤醒消费者
}
}
}
// 消费者函数
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv_cons.wait(lock, []{return !items.empty() || !cv_cons.wait_for(lock, std::chrono::seconds(1)).Occurred();}); // 等待队列非空或1秒超时
if (!items.empty()) { // 队列非空,消费元素
int value = items.front();
items.pop();
std::cout << "Consumed item: " << value << std::endl;
cv_prod.notify_one(); // 唤醒生产者
} else {
break; // 没有数据,退出
}
}
}
};
int main() {
Buffer buffer;
std::thread producer_thread(buffer.producer);
std::thread consumer_thread(buffer.consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
```
这段代码创建了一个缓冲区(`Buffer`),生产者和消费者各在一个单独的线程中运行。生产者不断地向队列添加元素,消费者则不断从中取走元素。通过互斥锁和条件变量的配合,实现了生产者和消费者之间的同步。当队列满或空时,相应线程会进入等待状态,直到满足条件为止。当所有的元素都被消费完毕,主线程会结束进程。
阅读全文