c++11多线程学习笔记之四 生产消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #ifndef MY_QUEUE_H__ #define MY_QUEUE_H__ #include<list> #include<mutex> #include<thread> #include<condition_variable> #include <iostream> template <typename T> class SyncQueue{ public : SyncQueue( int maxSize = 10) :maxSize_(maxSize), flagStop_( false ) {} bool IsEmpty() { std::lock_guard<std::mutex> locker(mutex_); return queue_.empty(); } bool IsFull() { std::lock_guard<std::mutex> locker(mutex_); return queue_.size() == maxSize_; } void Stop() { { std::lock_guard<std::mutex> locker(mutex_); flagStop_ = true ; } notFull_.notify_all(); notEmpty_.notify_all(); } template<typename F> void Add(F&& x) { std::unique_lock<std::mutex> locker(mutex_); notFull_.wait(locker, [ this ]{ return flagStop_ || queue_.size() < maxSize_; }); if (flagStop_) return ; queue_.push_back(std::forward<F>(x)); notEmpty_.notify_one(); } public : void Put( const T& x) { Add(x); } void Put(T&& x) { Add(std::forward<T>(x)); } void Take(T& t) { std::unique_lock<std::mutex> locker(mutex_); notEmpty_.wait(locker, [ this ]{ return flagStop_ || !queue_.empty(); }); if (flagStop_) return ; t = queue_.front(); queue_.pop_front(); notFull_.notify_one(); } private : std::list<T> queue_; std::mutex mutex_; std::condition_variable notEmpty_; std::condition_variable notFull_; int maxSize_; bool flagStop_; }; #endif//MY_QUEUE_H__ |
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // 111.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "MyQueue.h" #include <windows.h> SyncQueue< int > g_queue(15); void ProduceTask() { for ( int i = 0; i < 20; i++) { g_queue.Add(i); Sleep(50); } } void ConsumerTask() { for ( int i = 0; i < 20; i++) { int j = 0; g_queue.Take(j); std::cout << j << " " ; } std::cout << std::endl; std::cout << "stop now" << std::endl; g_queue.Stop(); } int _tmain( int argc, _TCHAR* argv[]) { std::thread producer(ProduceTask); // 创建生产者线程. std::thread consumer(ConsumerTask); // 创建消费之线程. producer. join (); consumer. join (); return 0; } |
单线程生产 单线程消费 使用了条件变量 互斥量 线程 AUTO变量 左值右值
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


分类:
c++代码练习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话