linux下c++實現簡單的生產者消費者隊列模式
2023-09-27 14:29:31 时间
生產者消費者是一個經典的模式
利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度
便於對生產者和消費者的修改
下面記錄的是一個經典的單一生產者多消費者的模式
以隊列做為緩衝區,實現產品的FIFO
生產者調用緩衝區的push函數,將產品加入緩衝區
消費者調用緩衝區的pop函數,將產品從緩衝區取出
因為生產者與消費者分屬於不同的線程,所以要設置鎖
class CacheQueue private: * @brief 緩衝隊列 queue int * _requests; * @brief 互斥鎖 pthread_mutex_t _mutex; * @brief Queue not full conditional object pthread_cond_t _not_full_cond; * @brief Queue not empty conditional object pthread_cond_t _not_empty_cond; uint32_t _bufSize; public: ChacheQueue(); void SetMaxLength(uint32_t bufSize); * @brief 向隊列添加產品 * @param [in] req: 待添加的產品 void Push(int req); * @brief 從隊列中取出一個產品 * @param [return] : 從隊列中取出的產品 int Pop(uint32_t timeout); * @brief 析構函數 ~CacheQueue(); };
重要的函數是Push和Pop,生產者調用Push向緩衝區添加產品,消費者則調用Pop函數獲取產品
線程條件_not_full_cond表示隊列不滿,可以添加產品
線程條件_not_empty_cond表示隊列不空,可以獲取產品
Push函數
void CacheQueue::Push(int req) * 上鎖 pthread_mutex_lock( _mutex); * 如果隊列滿,等待信號 while (_requests- size() == _bufSize) pthread_cond_wait( _not_full_cond, _mutex); _requests- push(req); * 發送非空信號 pthread_cond_signal( _not_empty_cond); * 解鎖 pthread_mutex_unlock( _mutex); }
Pop函數
int CacheQueue::Pop(uint32_t timeout) int ret = 0; int req = NO_DATA; * 上鎖 pthread_mutex_lock( _mutex); * 若隊列空等待指定時間 struct timeval now; struct timespec timepass; gettimeofday( now, NULL); timepass.tv_sec = now.tv_sec + timeout; timepass.tv_nsec = 0; while (ret == 0 _requests- empty()) ret = pthread_cond_timedwait( _not_empty_cond, _mutex, timepass); * 沒有數據,返回沒有數據標識 if(ret!=0) pthread_mutex_unlock( _mutex); return req; * 返回數據,發送隊列非滿信號 req = _requests- front(); _requests- pop(); pthread_cond_signal( _not_full_cond); * 解鎖 pthread_mutex_unlock( _mutex); return req; }
Linux下vi 编辑器模式 命令模式 刚进入vi编辑器的模式就是命令模式,命令模式主要用于对代码进行复制粘贴等操作 在其他模式下按下esc进入命令模式
相关文章
- Linux性能分析 vmstat基本语法
- Linux下的文件输入/输出端口
- 快速指南:C/C++程序员如何从 Windows 向 Linux 迁移
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
- 【ARM-Linux开发】Linux环境下使用eclipse开发C++动态链接库程序
- VScode:连接Linux服务器(C++)【设置SSH targets】【进行远程代码调试运行】【代码都在Linux系统,本地无代码】
- linux中管道符“|”的作用 find的作用
- Linux 利用 expect 进行 scp 自动同步文件
- Linux网络-IP协议
- 深入了解Linux I/O重定向
- Linux下改动Matlab配置文件支持C++ 11标准以生成mex
- Linux下使用yum安装MYSQL
- linux下C++动态链接C++库示例详解
- Linux环境编译安装Nginx
- linux 查看文件夹文件大小数目等信息
- [C++]Linux之虚拟文件系统[/proc]中关于CPU/内存/网络/内核等的一些概要性说明
- [C++]Linux之网络实时检测功能
- Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法
- Linux 下安装Eclipse C++
- Linux下装Eclipse C/C++,以及环境配置
- Linux shell脚本中字符串引用
- Linux shell脚本中字符串替换
- linux下C++ 插件(plugin)实现技术
- 自己工作常用的linux命令:tail 命令
- linux 操作 ftp 常用命令
- linux安装Eclipse c++环境
- linux及windows对拍程序 C++
- C/C++/Linux「学习必备」珍藏多年的学习网站分享 | 工欲善其事必先利其器
- Linux C/C++ 处理命令行参数
- Linux系统Wpa_supplicant用法小结
- linux下练习 c++ 输入输出迭代器