当前位置: 首页 > news >正文

门户网站的发展趋势企业官网模板免费

门户网站的发展趋势,企业官网模板免费,外包一个企业网站多少钱,筹划电子商务网站建设阅读导航 引言一、生产者消费者模型二、环形队列简介三、基于环形队列的生产者消费者模型#xff08;C 代码模拟实现#xff09;⭕Makefile文件⭕ . h 头文件✅sem.hpp✅ringQueue.hpp ⭕ . cpp 文件✅testMain.cpp 温馨提示 引言 在上一篇文章中#xff0c;我们深入探讨了… 阅读导航 引言一、生产者消费者模型二、环形队列简介三、基于环形队列的生产者消费者模型C 代码模拟实现⭕Makefile文件⭕ . h 头文件✅sem.hpp✅ringQueue.hpp ⭕ . cpp 文件✅testMain.cpp 温馨提示 引言 在上一篇文章中我们深入探讨了Linux操作系统中的POSIX信号量这是一个强大的同步机制用于协调进程或线程对共享资源的访问。通过对信号量的深入理解和应用我们学习了如何有效地解决并发编程中的竞争条件确保程序的稳定性和效率。随着并发编程技术的不断深入理解和掌握更多同步模型对于开发高性能、可靠的软件系统变得尤为重要。因此本篇文章将继续我们的并发编程之旅引入一个经典且实用的同步模型——基于环形队列的生产者消费者模型。 在本文中我们将详细探讨基于环形队列的生产者消费者模型的设计和实现。我们将介绍环形队列的数据结构分析生产者和消费者之间的同步机制探索如何利用前文提到的POSIX信号量以及其他同步工具如互斥锁来实现生产者和消费者之间高效、安全的数据交换。通过具体的代码示例和案例分析读者将能够深入理解生产者消费者模型的工作原理掌握如何在实际项目中设计和实现基于环形队列的高效同步模型。 探索基于环形队列的生产者消费者模型不仅能够加深我们对并发编程同步机制的理解还能够提升我们解决实际问题的能力。让我们一起继续并发编程的探索之旅解锁更多的编程技巧和知识。 一、生产者消费者模型 生产者消费者模型是并发编程中一个经典且重要的问题模型它描述了两类主体——生产者Producer和消费者Consumer在并发环境下对共享资源通常是缓冲区或队列的访问模式。生产者负责生成数据并将其放入缓冲区而消费者则从缓冲区取出数据进行处理。该模型的核心在于解决生产者和消费者之间的同步与通信问题保证数据在生产和消费时的一致性和可用性同时避免资源的冲突和浪费。对于希望深入了解生产者消费者模型的读者我们在之前的内容中有所介绍——链接⭕生产者消费者模型 通过上述简介希望读者能够对生产者消费者模型有一个初步的认识和理解。在并发编程的实践中该模型不仅是一个常见的问题场景也提供了一种思考并发问题的方法论对于提高编程技能和系统设计能力都有重要意义。 二、环形队列简介 环形队列是一种固定大小的、使用数组实现的队列数据结构特别在于其首尾相连的循环特性。这种结构允许当数组达到其容量上限时新加入的元素可以放置在数组的开始位置如果那里有空位。环形队列的这一设计使得它在空间利用和操作效率上具有显著优势尤其适用于有固定缓冲区需求的场景。 主要特点包括 固定大小一旦创建队列的大小就固定不变。高效操作入队和出队操作都非常高效因为它们仅涉及指针的简单移动。两个指针使用头指针和尾指针来分别追踪队列的第一个和最后一个元素。 环形队列广泛应用于操作系统、网络通信、生产者消费者模型等多个领域特别是在需要高效管理固定缓冲区资源的场合。实现环形队列时关键在于正确管理头尾指针的位置并准确判断队列的空或满状态。 三、基于环形队列的生产者消费者模型C 代码模拟实现 ⭕Makefile文件 ring_queue:testMain.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f ring_queue这段代码是一个Makefile脚本用于编译和清理一个名为ring_queue的项目。 ⭕ . h 头文件 ✅sem.hpp // 防止头文件重复包含的预处理指令。 #ifndef _SEM_HPP_ #define _SEM_HPP_// 引入输入输出流库虽然在此代码中未直接使用可能为后续扩展预留。 #include iostream // 引入POSIX信号量的头文件。 #include semaphore.h// 定义一个类 Sem。 class Sem { public:// 构造函数接收一个整数value作为信号量的初始值。Sem(int value){// 初始化信号量其中sem_是信号量对象的地址// 0表示信号量是当前进程的局部信号量// value是信号量的初始值。sem_init(sem_, 0, value);}// p操作也称为wait操作用于减少信号量的值。// 如果信号量的值为0则调用此方法的线程将阻塞直到信号量的值大于0。void p(){sem_wait(sem_);}// v操作也称为signal操作用于增加信号量的值。// 如果有其他线程因为等待此信号量而阻塞则它们中的一个将被唤醒。void v(){sem_post(sem_);}// 析构函数用于销毁信号量。~Sem(){sem_destroy(sem_);}private:// 私有成员变量存储信号量对象的实例。sem_t sem_; };// 预处理指令的结束标志。 #endif这个Sem类提供了简单的接口来进行信号量的基本操作初始化构造函数、等待p方法、信号v方法和销毁析构函数。通过这个类可以更方便地在C项目中使用POSIX信号量进行同步操作。 ✅ringQueue.hpp // 防止头文件重复包含的预处理指令。 #ifndef _Ring_QUEUE_HPP_ #define _Ring_QUEUE_HPP_// 引入所需的头文件。 #include iostream #include vector #include pthread.h #include sem.hpp// 定义一个全局常量作为队列的默认大小。 const int g_default_num 5;// 定义一个模板类RingQueue用于实现环形队列。 templateclass T class RingQueue { public:// 构造函数参数default_num指定队列的大小默认为g_default_num。RingQueue(int default_num g_default_num): ring_queue_(default_num), num_(default_num),c_step(0),p_step(0),space_sem_(default_num), // 初始化空间信号量表示可用空间数量。data_sem_(0) // 初始化数据信号量表示队列中的数据项数量。{pthread_mutex_init(clock, nullptr); // 初始化消费者互斥锁。pthread_mutex_init(plock, nullptr); // 初始化生产者互斥锁。}// 析构函数销毁互斥锁。~RingQueue(){pthread_mutex_destroy(clock);pthread_mutex_destroy(plock);}// push方法生产者调用向队列中添加元素。void push(const T in){space_sem_.p(); // 等待有空间可写。pthread_mutex_lock(plock); // 获取生产者互斥锁。ring_queue_[p_step] in; // 将元素添加到队列中。p_step % num_; // 环形逻辑如果到达末尾则回到开始。pthread_mutex_unlock(plock); // 释放生产者互斥锁。data_sem_.v(); // 增加数据信号量表示有新数据可读。}// pop方法消费者调用从队列中取出元素。void pop(T *out){data_sem_.p(); // 等待有数据可读。pthread_mutex_lock(clock); // 获取消费者互斥锁。*out ring_queue_[c_step]; // 从队列中取出元素。c_step % num_; // 环形逻辑如果到达末尾则回到开始。pthread_mutex_unlock(clock); // 释放消费者互斥锁。space_sem_.v(); // 增加空间信号量表示有空间可写。}private:std::vectorT ring_queue_; // 使用vector存储队列元素。int num_; // 队列的大小。int c_step; // 消费者在队列中的当前位置。int p_step; // 生产者在队列中的当前位置。Sem space_sem_; // 控制队列空间的信号量。Sem data_sem_; // 控制队列中数据的信号量。pthread_mutex_t clock; // 消费者互斥锁。pthread_mutex_t plock; // 生产者互斥锁。 };#endif // 预处理指令的结束标志。这个环形队列的实现利用信号量space_sem_和data_sem_来控制队列的空间和数据确保生产者不会在队列满时添加元素消费者不会在队列空时尝试取出元素。同时通过两个互斥锁clock和plock分别保护消费者和生产者的操作防止并发环境下的数据竞争问题。这样的设计使得RingQueue既能高效地管理数据又能保证线程安全。 ⭕ . cpp 文件 ✅testMain.cpp // 包含RingQueue类的头文件。 #include ringQueue.hpp #include cstdlib // 包含标准库用于rand()等函数。 #include ctime // 用于time()函数。 #include sys/types.h // 包含类型定义例如pid_t。 #include unistd.h // 包含各种常量和类型并声明了各种函数例如sleep()和getpid()。// 消费者线程的工作函数。 void *consumer(void *args) {RingQueueint *rq (RingQueueint *)args; // 将传入的参数转换为RingQueue指针。while(true){sleep(1); // 休眠1秒模拟处理时间。int x;rq-pop(x); // 从环形队列中取出一个元素。// 打印消费信息包括消费的值和当前线程ID。std::cout 消费: x [ pthread_self() ] std::endl;} }// 生产者线程的工作函数。 void *productor(void *args) {RingQueueint *rq (RingQueueint *)args; // 将传入的参数转换为RingQueue指针。while(true){int x rand() % 100 1; // 生成一个1到100之间的随机数。// 打印生产信息包括生产的值和当前线程ID。std::cout 生产: x [ pthread_self() ] std::endl;rq-push(x); // 将生成的随机数放入环形队列中。} }int main() {srand((uint64_t)time(nullptr) ^ getpid()); // 设置随机数种子确保每次运行结果不同。RingQueueint *rq new RingQueueint(); // 创建一个RingQueue对象。pthread_t c[3], p[2]; // 定义线程ID数组3个消费者和2个生产者。// 创建消费者线程。pthread_create(c[0], nullptr, consumer, (void*)rq);pthread_create(c[1], nullptr, consumer, (void*)rq);pthread_create(c[2], nullptr, consumer, (void*)rq);// 创建生产者线程。pthread_create(p[0], nullptr, productor, (void*)rq);pthread_create(p[1], nullptr, productor, (void*)rq);// 等待所有线程完成。for(int i 0; i 3; i) pthread_join(c[i], nullptr);for(int i 0; i 2; i) pthread_join(p[i], nullptr);return 0; // 程序结束。 }这段代码展示了如何使用前面定义的RingQueue类来创建一个多生产者-多消费者模型。在这个模型中生产者生成随机数并将其放入环形队列而消费者从队列中取出这些数字并处理它们。 首先通过srand()设置随机数种子以确保每次程序运行时生成的随机数序列不同。然后它创建了一个RingQueueint对象用于存储生产者线程生成的整数。 接着代码创建了3个消费者线程和2个生产者线程。每个线程都被分配了一个工作函数生产者调用productor函数而消费者调用consumer函数。这些线程通过pthread_create函数创建并将RingQueue对象作为参数传递给它们的工作函数。 最后main函数使用pthread_join等待所有线程完成以确保程序在所有线程都执行完毕后才退出。 温馨提示 感谢您对博主文章的关注与支持如果您喜欢这篇文章可以点赞、评论和分享给您的同学这将对我提供巨大的鼓励和支持。另外我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新不要错过任何精彩内容 再次感谢您的支持和关注。我们期待与您建立更紧密的互动共同探索Linux、C、算法和编程的奥秘。祝您生活愉快排便顺畅
文章转载自:
http://www.morning.rmmz.cn.gov.cn.rmmz.cn
http://www.morning.ybgcn.cn.gov.cn.ybgcn.cn
http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn
http://www.morning.txgjx.cn.gov.cn.txgjx.cn
http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn
http://www.morning.nclbk.cn.gov.cn.nclbk.cn
http://www.morning.fbmjw.cn.gov.cn.fbmjw.cn
http://www.morning.seoqun.com.gov.cn.seoqun.com
http://www.morning.mjgxl.cn.gov.cn.mjgxl.cn
http://www.morning.ysbhj.cn.gov.cn.ysbhj.cn
http://www.morning.jpgfq.cn.gov.cn.jpgfq.cn
http://www.morning.ppqzb.cn.gov.cn.ppqzb.cn
http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn
http://www.morning.cpfx.cn.gov.cn.cpfx.cn
http://www.morning.jhgxh.cn.gov.cn.jhgxh.cn
http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn
http://www.morning.zdqsc.cn.gov.cn.zdqsc.cn
http://www.morning.drndl.cn.gov.cn.drndl.cn
http://www.morning.ljbpk.cn.gov.cn.ljbpk.cn
http://www.morning.gnkbf.cn.gov.cn.gnkbf.cn
http://www.morning.yaqi6.com.gov.cn.yaqi6.com
http://www.morning.gydsg.cn.gov.cn.gydsg.cn
http://www.morning.yxwnn.cn.gov.cn.yxwnn.cn
http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn
http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn
http://www.morning.ztcwp.cn.gov.cn.ztcwp.cn
http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn
http://www.morning.ldspj.cn.gov.cn.ldspj.cn
http://www.morning.rttkl.cn.gov.cn.rttkl.cn
http://www.morning.rglzy.cn.gov.cn.rglzy.cn
http://www.morning.kjgrg.cn.gov.cn.kjgrg.cn
http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn
http://www.morning.vattx.cn.gov.cn.vattx.cn
http://www.morning.ssjee.cn.gov.cn.ssjee.cn
http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn
http://www.morning.rmppf.cn.gov.cn.rmppf.cn
http://www.morning.fbhmn.cn.gov.cn.fbhmn.cn
http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn
http://www.morning.lrgfd.cn.gov.cn.lrgfd.cn
http://www.morning.rntby.cn.gov.cn.rntby.cn
http://www.morning.hrydl.cn.gov.cn.hrydl.cn
http://www.morning.pyxtn.cn.gov.cn.pyxtn.cn
http://www.morning.qykxj.cn.gov.cn.qykxj.cn
http://www.morning.rltsx.cn.gov.cn.rltsx.cn
http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn
http://www.morning.zrdhd.cn.gov.cn.zrdhd.cn
http://www.morning.bpmdh.cn.gov.cn.bpmdh.cn
http://www.morning.mfmrg.cn.gov.cn.mfmrg.cn
http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn
http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn
http://www.morning.rfycj.cn.gov.cn.rfycj.cn
http://www.morning.pphbn.cn.gov.cn.pphbn.cn
http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn
http://www.morning.hlshn.cn.gov.cn.hlshn.cn
http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn
http://www.morning.xhhqd.cn.gov.cn.xhhqd.cn
http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn
http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn
http://www.morning.hwcgg.cn.gov.cn.hwcgg.cn
http://www.morning.cfmrb.cn.gov.cn.cfmrb.cn
http://www.morning.glwyn.cn.gov.cn.glwyn.cn
http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn
http://www.morning.pwdrc.cn.gov.cn.pwdrc.cn
http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn
http://www.morning.nnwpz.cn.gov.cn.nnwpz.cn
http://www.morning.kwxr.cn.gov.cn.kwxr.cn
http://www.morning.nzfqw.cn.gov.cn.nzfqw.cn
http://www.morning.bmtkp.cn.gov.cn.bmtkp.cn
http://www.morning.dmtbs.cn.gov.cn.dmtbs.cn
http://www.morning.ktsth.cn.gov.cn.ktsth.cn
http://www.morning.ndmbz.cn.gov.cn.ndmbz.cn
http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn
http://www.morning.tdxnz.cn.gov.cn.tdxnz.cn
http://www.morning.tdwjj.cn.gov.cn.tdwjj.cn
http://www.morning.snyqb.cn.gov.cn.snyqb.cn
http://www.morning.jggr.cn.gov.cn.jggr.cn
http://www.morning.hhpbj.cn.gov.cn.hhpbj.cn
http://www.morning.ymrq.cn.gov.cn.ymrq.cn
http://www.morning.xhftj.cn.gov.cn.xhftj.cn
http://www.morning.tsnq.cn.gov.cn.tsnq.cn
http://www.tj-hxxt.cn/news/256092.html

相关文章:

  • 网站内嵌地图品牌设计公司招聘
  • 做刷题网站赚钱么仲恺住房和城乡建设局网站
  • 去哪找网站建设公司建设银行网站半天进不去
  • 做的网站在百度上搜不出来西安做网站印象网络
  • 湛江市工程建设领域网站泉州模板建站源码
  • 做的最好的快餐网站网站规划与建设心得体会
  • 平安保险网站wordpress有插件怎么用
  • 公路建设管理办公室网站登录自己网站的后台 wordpress
  • 长宁苏州网站建设浙江网站建设企业
  • 响应式网站导航layui做移动网站
  • 零点研究咨询集团官方网站建设苏州知名网站建设建站公司
  • 江苏建设通网站网站建设完整版
  • ip直接访问网站 备案wordpress设置ssl网站打不开
  • 百度商桥网站燕郊做网站的
  • 添加网站绑定主机名wordpress轮播插件
  • 自定义优定软件网站建设班组建设展板哪个网站有
  • 一个工厂做网站有用吗校园网页设计模板
  • 营销式网站深圳房管局官网查询系统
  • 网站建设详细合同范本餐饮网站建设思路
  • 做网站大概多少酒泉哪家公司可以做网站
  • 搭建网站步骤温州建设局网站林南飞
  • 建设银行网站首页口重庆丰标建设网站
  • 贵阳做网站优化网站建设所需的硬软件
  • 足球竞猜网站开发怎么把自己的网站放到网上
  • 上虞中国建设银行官网站3d网络游戏前十名
  • 协助别人做网站犯法么易思企业网站管理
  • 做网站需要了解的内容网站二维码链接怎么做
  • 搭建网站的方案wordpress安装上传
  • 网站正在备案中杭州网站推广公司
  • 数据库在网站建设中的作用小程序游戏怎么赚钱