linux下c++實現簡單的生產者消費者隊列模式
引言
生產者消費者是一個經典的模式
利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度
便於對生產者和消費者的修改
下面記錄的是一個經典的單一生產者多消費者的模式
設計思路
以隊列做為緩衝區,實現產品的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下c++實現簡單的生產者消費者隊列模式的更多相关文章
- 簡單工廠模式-之-什麼是產品線 And 抽象工廠模式-之-什麼是產品族
簡單工廠模式-之-什麼是產品線 簡單工廠模式中,有一個概念就是使用了多層次的產品結構,那麼什麼是產品結構或者說什麼是產品線? 假定我們有一個基準的產品標準Product,那麼所有繼承該基類或者傳遞基類 ...
- 常见压缩格式分析,及 Linux 下的压缩相关指令
可先浏览加粗部分 一.常见压缩档 *.zip | zip 程式壓縮打包的檔案: (很常见,但是因为不包含文件名编码信息,跨平台可能会乱码) *.rar | winrar 程序压缩打包的档案:(在win ...
- IO流簡單代碼
今天測試了一下,在博客園裏HTML源碼編譯器裏寫CSS内部樣式,更新編譯后,内部樣式可用,但是會將寫的内部樣式代碼强制加上代碼注釋進行編譯,有點類似于强制注入.編譯后的效果就是在前面加入了一個空的p標 ...
- Linux下中文字符乱码的问题
来源:Linux社区 作者:frankfellow Linux下中文经常会出现乱码,有的是浏览网页出现乱码:有的是文本模式下显示中文出现乱码.下图显示的是我遇到的问题.我安装的是CentOS,x-w ...
- 【转】基于Linux下的TCP编程
http://blog.csdn.net/tigerjibo/article/details/6775534 一.Linux下TCP编程框架 TCP网络编程的流程包含服务器和客户端两种模式.服务器模式 ...
- Linux下用户管理:创建用户指定密码
首先我们来了解下Linux下用户管理的概念: 如上图所示,左边的一列表示用户名,中间的一列表示用户组,最右边的一列表示的是家目录.用户名我们这里处于简单就,添加了root,xm,xh三个用户.用户组和 ...
- Linux下的用户、组和权限
目录 一:用户和组信息的查看 查看用户信息 查看密码信息 查看组信息 特殊组wheel 二:用户和组信息的管理 用户管理 组管理 三:文件权限 文件权限的查看 文件权限的修改 ACL控制权限 setf ...
- 使用Mutex實現單一程式執行個體的注意事項(转)
相信大家都知道在.NET程式中若要實現單一程式執行個體,一般來說有幾種方法,像是去判斷是否已經有開啟的Process是相同的程式.用Mutex與Semaphore之類的技術來判斷是否程式正在開啟.但是 ...
- [Xamarin] 簡單實作ListActivity (转帖)
但是文中案例因為是用事先設好的Layout 但是如果需要被選擇的東西很多時該怎麼辦 我們討論一下,如何製作很簡單的List . 首先我們得先參考一下再android 思維下要製作一個List 需要的架 ...
随机推荐
- SQL 的一个技巧
遇到一个需求,项目是我接手二次开发的,之前的大神设计数据库,订单表中没有订单号,现在让我加上这个号,规则是订单创建日期加上自增的ID,ID需要补足5位,例:00002,00124,01245这样.这个 ...
- 实例介绍Cocos2d-x物理引擎:碰撞检测
碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsCo ...
- css 笔记——设置禁用中文输入法
ime-mode ime-mode的语法解释如下: ime-mode : auto | active | inactive | disabled 取值: auto : 默认值.不影响IME的状态.与 ...
- OpenCV和Matplotlib色彩空间模式不一致的问题
当用OpenCV读取彩色图像时,OpenCV是以(BGR)的顺序存储图像数据的,而Matplotlib是以(RGB)的顺序显示图像的. 可以用下面的程序来证明这一点 import cv2 import ...
- iOS 简单总结:description方法\NSLog函数
1.description方法是NSObject自带的方法,包括类方法和对象方法 + (NSString *)description; // 默认返回 类名 - (NSString *)descrip ...
- PHP基础在线视频教程高清版
这个是我给大家介绍的PHP基础在线视频教程高清版,目前PHP慢慢垄断WEB的语言编写市场了,PHP 是一种服务器内置式的script 语言,它的出现使得在unix上快速地开发动态web成为现实.PHP ...
- 汇编语言-打印部分ASCII表
用表格形式显示字符 1. 题目:用表格形式显示ASCII字符 2.要求:按15行×16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字 ...
- DTcms 扩展字段标签调用
前台模版: 文章列表:{dr[author]} 文章内容{model.fields[author]} 点击数 后台CS文件:model.fields["author"].ToStr ...
- HTML5 drag & drop 拖拽与拖放简介
DataTransfer 对象:退拽对象用来传递的媒介,使用一般为Event.dataTransfer. draggable 属性:就是标签元素要设置draggable=true,否则不会有效果,例如 ...
- 关于HTML代码的转义
笔记: 1.在通过jsonp方式传输HTML代码的时候,为了防止代码中的一些字符影响json的语法,需要对HTML代码进行转义. 2.转义的时候可以只转义特殊字符(引号之类的),也可以把所有字符(中文 ...