在C++11并发学习之四:线程同步(续)中实际上用条件变量实现了一个简单的单生产者-单消费者模型,也就是一个生产者和一个消费者。
本文将实现单生产者-多消费者模型、多生产者-单消费者模型和多生产者-多消费者模型。前两种实际上是简化版的多生产者-多消费者,因此只需要实现第三种。
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
int counter=0;
int maxSize = 30;
std::mutex mtx;
std::queue<int> dataQuene; // 被生产者和消费者共享
std::condition_variable producer, consumer; // 条件变量是一种同步机制,要和mutex以及lock一起使用
void func_consumer()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));// 消费者比生产者慢
std::unique_lock<std::mutex> lck(mtx);
consumer.wait(lck, [] {return dataQuene.size() != 0; }); // 消费者阻塞等待, 直到队列中元素个数大于0
int num=dataQuene.front();
dataQuene.pop();
std::cout << "consumer " << std::this_thread::get_id() << ": "<< num <<std::endl;
producer.notify_all(); // 通知生产者当队列中元素个数小于maxSize
}
}
void func_producer()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(900)); // 生产者稍微比消费者快
std::unique_lock<std::mutex> lck(mtx);
producer.wait(lck, [] {return dataQuene.size() != maxSize; });// 生产者阻塞等待, 直到队列中元素个数小于maxSize
++counter;
dataQuene.push(counter);
std::cout << "producer " << std::this_thread::get_id() << ": "<< counter <<std::endl;
consumer.notify_all(); //通知消费者当队列中的元素个数大于0
}
}
int main()
{
std::thread consumers[2], producers[2];
// 两个生产者和消费者
for (int i = 0; i < 2; ++i)
{
consumers[i] = std::thread(func_consumer);
producers[i] = std::thread(func_producer);
}
for (int i = 0; i < 2; ++i)
{
producers[i].join();
consumers[i].join();
}
system("pause");
return 0;
}
运行结果
参考链接:https://blog.csdn.net/u013390476/article/details/52067321
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容