c++实现生产者消费者
时间: 2024-11-30 21:16:41 浏览: 35
在C++中,生产者消费者问题是一种经典的并发编程示例,它模拟了两个线程:一个生产者负责生成数据放入缓冲区,另一个消费者则从缓冲区取出并消费数据。这里通常会使用互斥锁(mutex)、条件变量(condition_variable)或信号量(semaphore)来同步两个线程的操作,确保数据的一致性和资源的公平分配。
下面是一个简单的C++生产者消费者模型的伪代码实现:
```cpp
#include <queue>
#include <thread>
class Buffer {
public:
std::mutex mtx;
std::condition_variable cond;
int count = 0; // 缓冲区元素数量
void produce(int data) {
std::unique_lock<std::mutex> lck(mtx);
while (count == capacity) {
cond.wait(lck); // 如果缓冲已满,等待
}
buffer.push(data);
++count;
cond.notify_one(); // 唤醒消费者
}
void consume() {
std::unique_lock<std::mutex> lck(mtx);
while (count == 0) {
cond.wait(lck); // 如果缓冲为空,等待
}
int data = buffer.front();
buffer.pop();
--count;
// 消费操作...
lck.unlock();
}
};
int main() {
Buffer buf(5); // 设置缓冲区大小为5
std::thread producer([](Buffer& b) { for (int i = 0; i < 10; ++i) b.produce(i); });
std::thread consumer([](Buffer& b) { b.consume(); });
producer.join();
consumer.join();
return 0;
}
```
在这个例子中,`produce`函数用于向缓冲区添加数据,如果缓冲区已满,则等待直到有消费者取走数据。`consume`函数用于从缓冲区移除数据,如果缓冲区为空,则等待直到有生产者填满数据。通过`mutex`和`condition_variable`的配合,实现了线程安全的数据交换。
阅读全文