C++ 条件者与生产者模型
时间: 2023-12-12 21:22:07 浏览: 89
条件变量和互斥锁通常用于实现生产者和消费者模型。在生产者和消费者模型中,有两类线程:生产者线程和消费者线程。生产者线程负责生产数据并将其存储在共享内存区域中,而消费者线程负责读取这些数据并进行处理。
下面是一个简单的生产者和消费者模型的C++代码示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> q;
void producer() {
for(int i = 0; i < 10; i++) {
std::unique_lock<std::mutex> lck(mtx); // 获取互斥锁
q.push(i); // 生产数据
cv.notify_one(); // 通知消费者线程
}
}
void consumer() {
while(true) {
std::unique_lock<std::mutex> lck(mtx); // 获取互斥锁
cv.wait(lck, []{ return !q.empty(); }); // 等待条件变量成立
int data = q.front(); // 获取数据
q.pop(); // 删除数据
std::cout << "Consumed: " << data << std::endl; // 处理数据
}
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
在上面的代码中,producer函数是生产者线程,它将0到9的整数生产并存储在队列q中。consumer函数是消费者线程,它等待条件变量成立,即等待队列q非空,然后获取队列的第一个元素,并将其从队列中删除。在本例中,我们只是简单地打印出消费的数据。
在主函数中,我们创建了两个线程,一个是生产者线程,另一个是消费者线程。我们使用join()方法等待两个线程完成执行。
这是一个简单的生产者和消费者模型的实现,使用条件变量和互斥锁可以实现线程之间的同步,避免了竞争条件和死锁等问题。
阅读全文