原贴是在知乎上看到的,实现了最简单的生产者与消费者模型,在此记录一下。
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> NumQueue;
std::mutex mtx;
std::condition_variable cv_producer;
std::condition_variable cv_consumer;
int main(int argc, char *argv[])
{
bool bIsEnd = false;
std::thread thr_producer([&]()
{
for(int i = 0; i < 10; i++)
{
std::unique_lock<std::mutex> unq_lck(mtx);
// 队列非空时阻塞,直到队列为空时解除阻塞,才生产下一个数字
cv_producer.wait(unq_lck, [&](){ return NumQueue.empty(); });
NumQueue.push(i);
cv_consumer.notify_all();
}
cv_consumer.notify_all();
bIsEnd = true;
});
std::thread thr_consumer([&]()
{
while(!bIsEnd)
{
std::unique_lock<std::mutex> unq_lck(mtx);
// 队列为空时阻塞,直到队列非空时解除阻塞,消费队列中的一个数字
cv_consumer.wait(unq_lck, [&](){ return !NumQueue.empty(); });
int pop_num = NumQueue.front();
NumQueue.pop();
std::cout << pop_num << std::endl;
cv_producer.notify_all();
}
});
thr_producer.join();
thr_consumer.join();
return 0;
}
看完代码,细细品一下其中的逻辑,正是实现了最经典的生产者与消费者模型。