生产者消费者代码C++
时间: 2023-10-15 15:07:21 浏览: 92
下面是一个简单的生产者消费者代码实现,使用C++的STL容器queue实现:
```c++
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
// 缓冲区大小
const int buf_size = 10;
// 生产者数量
const int producer_num = 3;
// 消费者数量
const int consumer_num = 2;
// 缓冲区
queue<int> buf;
// 互斥锁和条件变量
mutex mtx;
condition_variable cv;
// 生产者线程函数
void producer(int id)
{
for (int i = 0; i < 5; i++) {
unique_lock<mutex> lock(mtx);
// 等待缓冲区不满
cv.wait(lock, []{ return buf.size() < buf_size; });
// 生产一个物品
int item = i + id * 1000;
buf.push(item);
cout << "producer " << id << " produce " << item << ", buf size: " << buf.size() << endl;
// 唤醒一个等待的消费者
cv.notify_one();
}
}
// 消费者线程函数
void consumer(int id)
{
while (true) {
unique_lock<mutex> lock(mtx);
// 等待缓冲区不空
cv.wait(lock, []{ return !buf.empty(); });
// 消费一个物品
int item = buf.front();
buf.pop();
cout << "consumer " << id << " consume " << item << ", buf size: " << buf.size() << endl;
// 唤醒一个等待的生产者
cv.notify_one();
// 休眠一段时间
this_thread::sleep_for(chrono::milliseconds(100));
}
}
int main()
{
// 创建生产者线程
vector<thread> producers;
for (int i = 0; i < producer_num; i++) {
producers.emplace_back(producer, i);
}
// 创建消费者线程
vector<thread> consumers;
for (int i = 0; i < consumer_num; i++) {
consumers.emplace_back(consumer, i);
}
// 等待所有线程结束
for (auto &t : producers) {
t.join();
}
for (auto &t : consumers) {
t.join();
}
return 0;
}
```
代码中使用了一个大小为10的缓冲区,3个生产者和2个消费者,每个生产者生产5个物品。在生产者线程中,如果缓冲区已满则等待条件变量,否则生产一个物品,并唤醒一个等待的消费者。在消费者线程中,如果缓冲区为空则等待条件变量,否则消费一个物品,并唤醒一个等待的生产者。注意需要使用互斥锁保护缓冲区的访问,否则会有竞争条件。
阅读全文
相关推荐

















