基于Blocking queue的生产消费模型

news/2025/11/3 21:48:29/文章来源:https://www.cnblogs.com/xdhking/p/19188391

file:

BlockQueue.hpp:

#pragma once
#include<pthread.h>
#include<cassert>
#include<queue>
const int maxsize=5;
template<class T>
class BlockQueue{
public:BlockQueue(){int n;n=pthread_mutex_init(&m_mutex,nullptr);assert(n==0);n=pthread_cond_init(&m_cpond,nullptr);assert(n==0);n=pthread_cond_init(&m_ppond,nullptr);assert(n==0);(void)n;}~BlockQueue(){pthread_mutex_destroy(&m_mutex);pthread_cond_destroy(&m_cpond);pthread_cond_destroy(&m_ppond);}void push(const T& task){pthread_mutex_lock(&m_mutex);while(is_full()){pthread_cond_wait(&m_ppond,&m_mutex);}m_q.push(task);pthread_cond_signal(&m_cpond);pthread_mutex_unlock(&m_mutex);}void pop(T &task){pthread_mutex_lock(&m_mutex);while(is_empty()){pthread_cond_wait(&m_cpond,&m_mutex);}task=m_q.front();m_q.pop();pthread_cond_signal(&m_ppond);pthread_mutex_unlock(&m_mutex);}
private:bool is_empty(){return m_q.size()==0;}bool is_full(){return m_q.size()==maxsize;}
private:std::queue<T> m_q;pthread_mutex_t m_mutex;pthread_cond_t m_cpond,m_ppond;
};

Task.hpp:

#pragma once
#include<functional>
class Task{
public:using func_t=std::function<int(int,int)>;Task(){}Task(const int &x,const int &y,func_t func):m_x(x),m_y(y),m_callback(func){}~Task(){}int operator()(){return m_callback(m_x,m_y);}
private:func_t m_callback;int m_x;int m_y;
};

MainCp.cpp:

#include "BlockQueue.hpp"
#include "Task.hpp"
#include<ctime>
#include<unistd.h>
#include<iostream>
using func_t=std::function<int(int,int)>;
std::vector<func_t> fs;
int add(int x,int y){return x+y;
}int divid(int x,int y){return x/y;
}
int mul(int x,int y){return x*y;
}
void *comsumer(void *args){BlockQueue<Task> *bq=static_cast<BlockQueue<Task>*>(args);while(true){Task t;bq->pop(t);std::cout<<"消费数据:"<<t()<<std::endl;sleep(1);}
}
void *productor(void *args){BlockQueue<Task> *bq=static_cast<BlockQueue<Task>*>(args);while(true){int x=rand()%10+1;int y=rand()%10+1;int taskid=rand()%3;bq->push(Task(x,y,fs[taskid]));std::cout<<"生产数据:"<<x<<' '<<y<<' '<<taskid<<std::endl;sleep(1);};
}
void init(){fs.push_back(add);fs.push_back(divid);fs.push_back(mul);
}
int main(){init();srand((unsigned int)time(nullptr)^getpid());BlockQueue<Task> *bq=new BlockQueue<Task>();pthread_t c,p;pthread_create(&c,nullptr,comsumer,(void*)bq);pthread_create(&p,nullptr,productor,(void*)bq);pthread_join(c,nullptr);pthread_join(p,nullptr);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/954929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React中useContext的基本使用和原理解析

React 中 useContext 的使用方法 在 React 中,useContext 是一个内置的 Hook,用于在函数组件中轻松访问 Context(全局公共状态),避免了手动逐层传递 props 的复杂性。它依赖于 Context API,通过 Provider 提供数…

JDK的安装过程

第一步:右击“此电脑”,在显示的菜单中单击“属性”,在“系统信息”中点击“高级系统设置” 第二步:在弹出的“系统属性”对话框中,选择“高级”选项卡中的“环境变量” 第三步:在弹出的对话框中,单击“系统变量…

阅读笔记0

第3章:基本工具 强调善用工具能大幅提升效率,工具是程序员的“第二双手”。文本编辑器:不止是打字,要熟练使用快捷键、自定义配置,甚至通过插件扩展功能(如代码补全、语法检查)。 ​ 版本控制:用Git等工具管理…

File文件操作

路径用//或者\ file可以代表文件也可以代表文件夹文件对象路径可以写相对路径也可以写绝对路径,相对路径默认是是从当前文件的项目名称下寻找 从javatest下找createnewfile创建完文件会返回true exist同理 调用方法都是…

越南航空数据泄露事件深度解析

2025年越南航空遭遇重大数据泄露事件,730万客户信息遭黑客组织窃取,包括邮箱、姓名、电话号码等敏感数据。本文详细分析事件经过、受影响数据类型及防护建议。越南航空数据泄露事件 事件概述 2025年10月,自称"…

P11261 [COTS 2018] 直方图 Histogram

P11261 [COTS 2018] 直方图 Histogram 题解看了这篇题解懂了的,大家也可以去看看。 以及,后来自己想出来了单调栈解法,看题解里似乎没有这个解法,所以交一发题解。题目传送门 欢迎光临我的博客 1.笛卡尔树做法 如果…

2025csp-j游记(废物版)

"生活就是在迷茫中前进" 11月1日周六考的试,周一已经有点忘了。。 DAY 初赛 j组初赛自我感觉良好,就是考完前几分钟ccf突然改代码,但只是加了个int n难绷。s组感觉自己没开智。更绝望的是隔壁班有个gesp保…

leetcode55. 跳跃游戏 45. 跳跃游戏 II

leetcode55. 跳跃游戏 45. 跳跃游戏 II55. 跳跃游戏 45. 跳跃游戏 II 我写的第一份通过的代码,问题在于重复更新浪费不少时间,内层循环可能会重复更新许多已经确定不是最优解的位置。class Solution {public int j…

个体户办理食品经营须知

非常好的问题,这两个问题都属于实际审批中高频且容易出错的关键点。下面我根据你提供的两份文件—— 📘《食品经营许可审查通则》(国家标准) 📗《山东省食品经营许可审查细则》(山东省地方标准) 为你做专业、…

redux-thunk和createAsyncThunk

你提到了一个非常有趣且常见的观点! 许多开发者确实认为,从“编写和阅读”异步逻辑的角度来看,手写 redux-thunk 的 async (dispatch) => {...} 形式,比 createAsyncThunk 更加直接和直观。⚖️ 两种异步写法的…

2025.11.3——1绿1蓝

普及+/提高 P1353 [USACO08JAN] Running S 简单DP 提高+/省选 P6880 [JOI 2020 Final] 奥运公交 / Olympic Bus T3,场切。

Next.js路由段配置选项笔记

前言 大家好,我是曦远。 本来是想发昨晚写好的 starblog 管理后台重构文章的 结果打开 blog 才发现忘记提交了😂 所以写一篇新的吧 正好最近正在大量使用 Next.js 我发现部署后的首次渲染很慢,才意识到「预热」这个…

2025.11.3 - A

今天java和数据结构,感觉挺好的。

【每日一面】实现一个深拷贝函数

基础问答 问:知道浅拷贝和深拷贝吗?为什么要用深拷贝? 答:拷贝,可以认为是赋值,对于 JavaScript 中的基础类型,如 string, number, null, boolean, undefined, symbol 等,在赋值给一个变量的时候,是直接拷贝值…

【AI说Rust 01】Rust 的学习路线

Rust 以其卓越的性能和内存安全性吸引了众多开发者。虽然它的学习曲线相对陡峭,但一份清晰的学习路线能让你事半功倍。下面这个路线图汇总了主流的学习阶段和资源,希望能帮你从零开始,逐步进阶。 flowchart LRA[Rus…

若依后端验证码实现

先去看前端的 参考详细讲解视频:https://www.bilibili.com/video/BV1HT4y1d7oA?spm_id_from=333.788.player.switch&vd_source=886219f6fb49f459fbfc8b80a8b39f3f&p=3 登录 前端请求为http://localhost/dev-…

解码LVGL事件

LVGL 事件系统 事件是 LVGL 响应用户操作(如点击、滑动)或控件状态变化的核心机制,通过 “事件绑定 - 回调函数” 实现交互逻辑。 事件核心特点多绑定支持:一个回调函数可绑定多个对象(如一个 “计数回调” 绑定两…

11.3号学习内容

阅读模型压缩的论文| https://doi.org/10.48550/arXiv.2010.03954 | header | | ----------------------------------------- | ------ | | | |

P11771 题解

blog。虽然糖丸了,但是卡了还是半天卡过去了。感谢出题人开 2s /kt!!最显然的暴力是,考虑直接算每个 \(i,j,k\) 的贡献。\(p_{i}\le p_k\wedge p_j\le p_k\):贡献为 \(0\)。 \(p_{i}>p_k\wedge p_j\le p_k\):…

MySQL排序算法

一、概述 ORDER BY的核心功能,是按照指定的单个或多个字段,对SELECT查询返回的结果集进行升序(ASC,默认)或降序(DESC)排列,以满足业务对数据有序性的需求。但要判断ORDER BY的实际执行效率,最直接的工具是EXP…