C++ 模板生产者消费者模型,可存放任意数据类型
2022/6/30 14:22:27
本文主要是介绍C++ 模板生产者消费者模型,可存放任意数据类型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
c++版本生产者消费者模型:
#include <mutex> #include <deque> #include <future> #include <iostream> template <typename T> class LoopQueue { public: LoopQueue() { } void Push(const T &element) { //这个lock用于对生产者间的同步 std::unique_lock<std::mutex> lock(m_mutex); m_deqDatas.push_back(element); //信号量用于生产者,消费者间的同步 // m_notEmpty.notify_one(); m_notEmpty.notify_all(); } T Pop() { //这个lock用于配合信号量的使用 std::unique_lock<std::mutex> lock(m_mutex); /*当后面的lambda返回false时,则信号量进入wait,此时自动释放lock *等待到信号量后,则再获取lock */ m_notEmpty.wait(lock, [this] { return !m_deqDatas.empty(); }); //取元素返回 T front = m_deqDatas.front(); m_deqDatas.pop_front(); return front; } bool Empty() { //这个lock用于对消费者,生产者线程的互斥 std::unique_lock<std::mutex> lock(m_mutex); return m_deqDatas.empty(); } size_t Size() { //这个lock用于对消费者,生产者线程的互斥 std::unique_lock<std::mutex> lock(m_mutex); return m_deqDatas.size(); } private: std::deque<T> m_deqDatas; //互斥量,对队列进行同步保护 std::mutex m_mutex; //用于限制消费者线程 std::condition_variable m_notEmpty; }; void producer(LoopQueue<int> *dep) { while (1) { std::this_thread::sleep_for(std::chrono::seconds(rand() % 3)); int num = rand() % 1000 + 1; dep->Push(num); std::cout << "producer, Push ==========: " << num << std::endl; // break; } } void consumer(LoopQueue<int> *dep) { while (1) { std::this_thread::sleep_for(std::chrono::seconds(rand() % 3)); int ret = dep->Pop(); std::cout << "consumer, Pop: ----------" << ret << std::endl; // break; } } int main() { srand(time(NULL)); LoopQueue<int> queue; std::future<void> fut1 = std::async(std::launch::async, producer, &queue); std::future<void> fut2 = std::async(std::launch::async, consumer, &queue); std::cout << "--------------------------------" << std::endl; fut1.wait(); // 等待异步结束 fut2.wait(); // 等待异步结束 std::cout << "================================" << std::endl; }
运行结果:
这篇关于C++ 模板生产者消费者模型,可存放任意数据类型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)
- 2025-01-03停止思考数据管道,开始构建数据平台:介绍Analytics Engineering Framework