html5wap网站模板上海天华建筑设计有限公司侯岳

news/2025/9/24 8:00:00/文章来源:
html5wap网站模板,上海天华建筑设计有限公司侯岳,长沙高端网站建设服务器,网站规划的要素不包括个人主页 #xff1a; 个人主页 个人专栏 #xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、生产者消费者模型二、基于阻塞队列的生产者消费者模型代码实现 总结 前言 本文是对于生产者消费者模型的知识总结 一、生产者消费者模型 生产者消费者模型就是… 个人主页 个人主页 个人专栏 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、生产者消费者模型二、基于阻塞队列的生产者消费者模型代码实现 总结 前言 本文是对于生产者消费者模型的知识总结 一、生产者消费者模型 生产者消费者模型就是通过一个容器来解决生产者消费者的强耦合问题。生产者和消费者彼此之间不直接通讯而是通过之间的容器来进行通讯所以生产者生产完数据之后不用等待消费者处理直接交给容器消费者不找生产者要数据而是直接从容器中取数据阻塞队列就相当于一个缓冲区平衡了生产者和消费者的处理能力其中这个容器就是用于生产者和消费者之间解耦的 (强耦合是指两个或多个系统组件或模块之间存在紧密依赖关系。) 特点 三种关系生产者与生产者之间(互斥)消费者与消费者之间(互斥)生产者与消费者之间(互斥 同步)两种角色生产者和消费者一个交易(通讯)场所一个容器(一段内存空间) 因为我们是多个线程访问同一个容器那必然会导致数据不一致的问题所以我们需要对该临界资源加锁所以生产者与生产者之间消费者与消费者之间生产者与消费者之间都是互斥的。 又因为容器可能为空(满)此时消费者(生产者)还一直在临界区申请锁又因没有数据(空间)而释放锁从而不断申请锁释放锁导致生产者(消费者)的饥饿问题。此时我们就需要生产者与消费者之间的同步。 对于2,3两点这很好理解不解释。 我们编写生产者消费者模型的本质就是对以上三点的维护。(互斥保证数据安全同步保证效率) 优点 解耦支持并发支持忙闲不均 对于第一点不就是生产者与消费者通过容器来解耦提升效率(如果没有这个容器则生产者生产完数据就必须等待消费者来接受处理数据不能立刻继续生产数据)。 对于第二点当生产者在生产数据时消费者也同时在处理数据 对于第三点当生产者生产数据的速度超过消费者的处理能力时容器可以起到缓存的作用将多余的数据暂时存储等待消费者有空闲时再进行处理。如果消费者处理数据的能力超过生产者时同理。 二、基于阻塞队列的生产者消费者模型 在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。 队列为空时从队列中取数据将被阻塞直到队列中有数据时被唤醒。队列为满时向队列中放入数据将被阻塞直到队列中有数据取出被唤醒。 代码实现 下面是一个单生成单消费模型 LockGuard.hpp 文件 将加锁释放锁交给一个对象处理当对象创建加锁对象销毁释放锁 #pragma once #include pthread.hclass Mutex { public:Mutex(pthread_mutex_t *mutex):_mutex(mutex){}void Lock(){pthread_mutex_lock(_mutex);}void UnLock(){pthread_mutex_unlock(_mutex);}~Mutex(){} private:pthread_mutex_t *_mutex; };class LockGuard { public:LockGuard(pthread_mutex_t *mutex): _lock(mutex){_lock.Lock();}~LockGuard(){_lock.UnLock();} private:Mutex _lock; };Blockqueue.hpp 文件 #pragma once #include iostream #include queue #include pthread.h #include LockGuard.hppusing namespace std; const int CAPACITY 5;templateclass T class BlockQueue { public:BlockQueue(int cap CAPACITY):_capacity(cap){pthread_mutex_init(_mutex, nullptr);pthread_cond_init(_p, nullptr);pthread_cond_init(_c, nullptr);}bool isFull(){return _bq.size() _capacity;}void Push(const T in){LockGuard mutex(_mutex);//pthread_mutex_lock(_mutex);while(isFull()){pthread_cond_wait(_p, _mutex);}_bq.push(in);// 唤醒策略为 生产一个消费一个pthread_cond_signal(_c);//pthread_mutex_unlock(_mutex);}bool isEmpty(){return _bq.size() 0;}void Pop(T *out){LockGuard mutex(_mutex);//pthread_mutex_lock(_mutex);while(isEmpty()){pthread_cond_wait(_c, _mutex);}*out _bq.front();_bq.pop();// 唤醒策略为 消费一个生产一个pthread_cond_signal(_p);//pthread_mutex_unlock(_mutex);}~BlockQueue(){pthread_mutex_destroy(_mutex);pthread_cond_destroy(_p);pthread_cond_destroy(_c);} private:queueT _bq;int _capacity;pthread_mutex_t _mutex;pthread_cond_t _p;pthread_cond_t _c; };Task.hpp 文件 #pragma once #include stringconst char *opers -*/%;enum {ok 0,div_zero,mod_zero };class Task { public:Task(){}Task(int x, int y, char op) : _data_x(x), _data_y(y), _oper(op){_code ok;}void Run(){switch (_oper){case :_result _data_x _data_y;break;case -:_result _data_x - _data_y;break;case *:_result _data_x * _data_y;break;case /:{if(_data_y 0){_code div_zero;}else{_result _data_x / _data_y;}}break;case %:{if(_data_y 0){_code mod_zero;}else{_result _data_x % _data_y;}}break;default:break;}}void operator()(){Run();}std::string PrintTask(){std::string ret std::to_string(_data_x);ret _oper;ret std::to_string(_data_y);ret ?;return ret;}std::string PrintResult(){std::string ret std::to_string(_data_x);ret _oper;ret std::to_string(_data_y);ret ;if(_code ok){ret std::to_string(_result);}else{ret ?;}ret [;ret std::to_string(_code);ret ];return ret;}~Task(){}private:int _data_x;int _data_y;char _oper;int _result;int _code; // 错误码 };Main.cc 文件 #include iostream #include pthread.h #include unistd.h #include ctime #include string.h #include BlockQueue.hpp #include Task.hpp using namespace std;void *producer(void *args) {BlockQueueTask *bq static_castBlockQueueTask *(args);// 产生任务while (true){int x rand() % 10 1;int y rand() % 10 1;char oper opers[rand() % strlen(opers)];Task task(x, y, oper);cout producer: task.PrintTask() endl;bq-Push(task);sleep(1);}return nullptr; }void *consumer(void *args) {// usleep(1000);BlockQueueTask *bq static_castBlockQueueTask *(args);// 获取任务处理任务while (true){if (bq-isFull()){Task task;bq-Pop(task);task();cout consumer: task.PrintResult() endl;//sleep(1);}} }int main() {srand(time(nullptr) ^ getpid());BlockQueueTask bq;pthread_t p;pthread_create(p, nullptr, producer, (void *)bq);pthread_t c;pthread_create(c, nullptr, consumer, (void *)bq);pthread_join(p, nullptr);pthread_join(c, nullptr);return 0; }那如何将这个单生产单消费该为多生产多消费呢因为多生产多消费本质也是多个线程访问临界资源那我们单生产和单消费不也是多个线程访问临界资源吗所以我们不需要对BlockQueue.hpp文件进行修改只需要在main函数中创建多个生产者和消费者即可。 #include iostream #include pthread.h #include unistd.h #include ctime #include string.h #include BlockQueue.hpp #include Task.hpp using namespace std;template class T class ThreadData { public:ThreadData(pthread_t tid, const string threadname, BlockQueueT *bq): _tid(tid), _threadname(threadname), _bq(bq){}public:pthread_t _tid;string _threadname;BlockQueueT* _bq; };void *producer(void *args) {ThreadDataTask *data static_castThreadDataTask *(args);// 产生任务while (true){int x rand() % 10 1;int y rand() % 10 1;char oper opers[rand() % strlen(opers)];Task task(x, y, oper);cout data-_tid , data-_threadname : task.PrintTask() endl;data-_bq-Push(task);sleep(1);}return nullptr; }void *consumer(void *args) {// usleep(1000);ThreadDataTask *data static_castThreadDataTask *(args);// 获取任务处理任务while (true){if (data-_bq-isFull()){Task task;data-_bq-Pop(task);task();cout data-_tid , data-_threadname : task.PrintResult() endl;// sleep(1);}} }int main() {srand(time(nullptr) ^ getpid());BlockQueueTask bq;pthread_t p1;ThreadDataTask data1(p1, product-1, bq);pthread_create(p1, nullptr, producer, (void *)data1);pthread_t p2;ThreadDataTask data2(p2, product-2, bq);pthread_create(p2, nullptr, producer, (void *)data2);pthread_t c1;ThreadDataTask data3(c1, consumer-1, bq);pthread_create(c1, nullptr, consumer, (void *)data3);pthread_t c2;ThreadDataTask data4(c2, consumer-2, bq);pthread_create(c2, nullptr, consumer, (void *)data4);pthread_join(p1, nullptr);pthread_join(p2, nullptr);pthread_join(c1, nullptr);pthread_join(c2, nullptr);return 0; }总结 以上就是我对于线程同步的总结。

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

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

相关文章

强大的网站wordpress分类目录 404

​ 引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁,加固是必不可少的措施之一。Flutter加固原理主要包括代码混淆、数据加密、安全存储、反调试与反分析、动态加载和安全通信等多个方面。通过综合运用这些措施,可以提高Flutter应用的安全性&#xf…

网站开发税收分类2_试列出网站开发建设的步骤

展开全部在SQL中 CHECK 的意思:约束CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么32313133353236313431303231363533e58685e5aeb931333365646261该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定…

网站开发pmp给公司做一个网站

深度学习介绍: 数据预处理

wap网站开发需要多少钱做网站怎么qq邮箱验证

在处理大量PDF文档时,有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

购物节优惠卷网站怎么做专业企业网站设计网络公司

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

【GitHub每日速递 250924】18 个 AI 投资大师齐上阵!这个开源对冲基金让你看透市场底牌

AI赋能对冲基金!18大智能代理协作,交易决策新玩法揭秘 virattt/ai-hedge-fund 是一个基于人工智能技术进行自动化投资决策的金融项目。简单讲,它是一个用Python构建的AI对冲基金团队,通过算法分析市场数据并执行交…

大岭山网站建设公司如何做公众号

按照K230_GPU应用实战.md 一、开发环境的准备 在src下创建文件夹,并在文件夹中创建Makefile mkdir my_vglite_code cd my_vglite_codeMakefile # SDK地址 K230SDK ? /root/k230/k230_sdk-main # 生成的可执行文件名字 BIN : test-vglite# 指定交叉编译器 CC : …

wap网站优化官方网站建站

https://pan.baidu.com/s/1uqEBGHn3dcVON18oRK5LNQ 提取码:gqqv 中文版不用看了,译者估计自己都不怎么用c11\14,翻译的巨垃圾。

济南营销网站制作上海仿站定制模板建站

共用体(联合体):在同一个存储空间存储不同数据的类型。 1、共用体的大小大于等于其最长成员的大小。 union A{char a;short b;int c;};union A u1;printf("%d",sizeof(u1)); 得出的结果为4(int)。 2、共…

政务中心网站建设方案无锡手机网站建设方案

前言: 昨天我们讲述了怎么利用emotion数据集进行deberta-v3-large大模型的微调,那今天我们就来输入一些数据来测试一下,看看模型的准确率,为了方便起见,我直接用测试集的前十条数据 代码: from transfor…

无法打开网站若要访问本地iis网站必须安装下列iis组件常见的网络推广工具

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高…

铜川泰士公馆建设网站网站的主题与风格说明

文章目录 Acwing:前缀和示例2845.统计趣味子数组的数目思路容易理解的写法:前缀和两层循环存在问题:超时 优化写法:两数之和思路,转换为哈希表 前缀和,就是求数组中某一段的所有元素的和。 求子数组中某一…

商务网站内容维护范围自己做抽奖网站违法吗

Python 的调试模式通常是通过使用 Python 的内置调试器 pdb 或者集成开发环境(IDE)如 PyCharm、Visual Studio Code 等中的调试工具来实现的。 使用 pdb pdb 是 Python 的标准库中的一个模块,它提供了一个交互式的源代码调试器。你可以使用…

建网站要大约多少钱智能建站代理

前言上一篇已经介绍了identity在web api中的基本配置&#xff0c;本篇来完成用户的注册&#xff0c;登录&#xff0c;获取jwt token。开始开始之前先配置一下jwt相关服务。配置JWT 首先NuGet安装包&#xff1a;<PackageReference Include"Microsoft.AspNetCore.Authent…

衡阳网站备案ps软件免费下载安装

昨天&#xff0c;鬼古女夫妇来京签名售书&#xff0c;中午我们三人在内蒙古宾馆吃的蒙古手把肉&#xff0c;喝了一瓶北京二锅头。晚上&#xff0c;《长篇小说选刊》编辑刘玉浦请我们及773恐怖小说的策划人花青女士在后海酒吧喝酒。中间白衣者为鬼古女夫妇。鬼古女恐怖小说新作《…

HJ9 提取不重复的整数

描述 对于给定的正整数 n ,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。具体地,如果遇到相同数字,保留在最右侧出现的第一个数字。 输入描述: 在一行上输入一个整数 n(1≦n≦10^8) 代表给定的整数。…

2025年国家科技奖初评公布(科技进步奖)

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 …

在与客户谈网页广告时如何让客户相信网站流量网站大学报名官网入口

文章目录 阿里云PAI pytorch大语言模型开发环境简介PAI-DSW 快速入门1. 安装和配置2. 模型训练2.1 数据集准备2.2 模型训练脚本准备2.3 提交训练作业 3. 部署模型为推理服务4. 调用推理服务 阿里云PAI pytorch大语言模型开发环境简介 PAI-DSW 快速入门 阿里云机器学习PAI&a…

鸿鹄网站建设网页加速器免费

使用asp.net core Identity IdentityServer灵活的设计中有一部分是可以将你的用户和他们的数据保存到数据库中的。如果你以一个新的用户数据库开始&#xff0c;那么&#xff0c;asp.net core Identity是一个选择。这个示例演示了如何在IdentityServer中使用asp.net core Ientit…

淘客免费交易网站建设shop商城系统

棒球元宇宙内容发展规划 1. 棒球元宇宙内容需求 分析现有棒球元宇宙内容缺口和痛点 在棒球运动中&#xff0c;元宇宙有着广阔的发展前景&#xff0c;但也存在着一些问题和挑战。其中最主要的问题之一是缺乏高质量、丰富多样的棒球元宇宙内容。现有的棒球元宇宙平台大多只提供…