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 需要的架 ...
随机推荐
- sqlserver之二进制和字符串sql语句
正常情况下我们对数据库的操作就是如下的写法来操作数据库 ID AS 编号,BookName AS 书名 FROM dbo.books ORDER BY ID; ; 但是在客户正在使用的数据库里,我们开 ...
- Yii zii.widgets.grid 隐藏列 方便js获取隐藏值
array( 'name' => $data->is_audit, 'value' => '$data->is_audit', 'headerHtmlOptions' => ...
- SQL Server监测查询性能
SQL Server提供了以下工具(SET选项)来支持查询的监测: IO统计 TIME统计 PROFILER统计 XML统计 1. IO统计 当这个选项开启的时,对一批查询中的每一个数据对象访问的查询 ...
- cocos2dx-lua class语法糖要注意了
cocos2dx-lua function.lua 定义了class方法,让lua实现继承像传统语言一样漂亮和方便 看定义 function class(classname, super) local ...
- 关于在windows7中使用Virtual Box 按照 安卓虚拟机几个注意事项
1.选择安卓原生镜像的问题 选择带PC的字眼的,也就是给平板PC使用的那个,我使用的版本是android-x86-4.0-r1-eeepc.iso其他类似版本也是可以的,因为我已经成功实践啦. 下载地 ...
- AngularJS开发相关配置
安装步骤: 1. Node.js,下载地址:https://nodejs.org/en/ 2. Git 下载地址:https://git-scm.com/download/ 3. Python (需为 ...
- 没有文件扩展".js"的脚本引擎 解决办法
在命令行运行JScript脚本时,遇到如下的错误提示: “输入错误: 没有文件扩展“.js”的脚本引擎.” 这样的错误,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联. 如系统中安装了ULT ...
- PHP去掉转义后字符串中的反斜杠\函数stripslashes
addslashes函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes则是去掉转义后字符串中的反斜杠\,比如当你提交一段 json数据到PHP端的时候可能会遇到json字符串中 ...
- CentOS 下 Codeblocks 的 安装 + 汉化 以及 基本使用介绍
Codeblocks 安装 注:在root用户下运行下列命令 1.安装gcc,需要c和c++两部分,默认安装下,CentOS不安装编译器的,在终端输入以下命令即可 yum install gcc yu ...
- fedora 安装chrome
1. 下载chrome的rpm安装包 2. 安装lsb: sudo yum install redhat-lsb.x86_64 3. rpm -i google-chrome-{xxxxx}.rp ...