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 需要的架 ...
随机推荐
- html dom的加载
操作HTML DOM文档的一个难题是,你的JavaScript代码可能在DOM完全载入之前运行,这会导致你的代码产生一些问题.页面加载时浏览器内部操作的顺序大致是这样的: 1. HTML被解析. 2. ...
- Centos6.5 64linux系统基础优化(一)
1 SecureCRT配色方案 http://blog.csdn.net/zklth/article/details/8937905 2 32位和64位Centos linux系统的区别及实际查看 ...
- 标准库string类型简述
若想使用标准库的string类需要使用如下声明: #include <string> Using std::string: Using std::wstring: 那么就可以使用这两个类了 ...
- 企业SAAS的春天,将以手机应用的形式,即将到来
派尔科技吴春福 *本文是派尔为什么要投身企业移动应用的内部分享文章: *我没有仔细核查资料,仅代表个人看法,思路也是在整理过程,逻辑未必很完整,看官将就着看. 企业SAAS,概念起源是N年前,先行者也 ...
- ZipArchive 的使用
新建一个项目,首先添加 System.IO.Compression.FileSystem 引用. 解压文件 using System.IO.Compression; namespace cl { st ...
- Memcached的安装(Linux)、操作、命令
最近在整理有关分布式缓存的服务器,做了一下老牌nosql服务器memcached的学习总结.文中所述的所有安装均是在联网的情况下进行的. 序: 什么是memcached: Free & ope ...
- TweenMax动画库学习(一)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- js 根据当前星期做跳转(代码段)
var week = [6,0,1,2,3,4,5]; $('.HotShop_head .HotShop_tab:eq('+week[new Date().getDay()]+')').click( ...
- php截取字符串的实例代码(支持utf-8)
分享下php中截取字符串的例子,支持utf-8格式. 1,截取字符串 <?php $string="2006年4月我又长大了一岁!"; echo substr($string ...
- WordPress 后台禁用Google Open Sans字体,加速网站
解决方法很简单,安装启用 Disable Google Fonts 或者 Remove Open Sans font Link from WP core 其中之一即可.或者如果你没有使用WP自带的官方 ...