优化网站 主题如何注册申请chn网站

张小明 2026/3/2 18:13:16
优化网站 主题,如何注册申请chn网站,网站集约化建设意见,wordpress 支付宝收钱学习比特课程后#xff0c;学习总结和代码实现。这节课产生了两点困惑#xff0c;查阅资料后#xff0c;有一下理解#xff1a;1.“FD 数值相同”≠“指向同一个管道”比如两次pipe()可能都生成pipefd[0]3#xff08;因为前一轮父进程关闭了读端 3#xff0c;FD 号被复用…学习比特课程后学习总结和代码实现。这节课产生了两点困惑查阅资料后有一下理解1.“FD 数值相同”≠“指向同一个管道”比如两次pipe()可能都生成pipefd[0]3因为前一轮父进程关闭了读端 3FD 号被复用但内核中会通过 “进程 ID FD 号” 来区分2.系统调用read()函数什么时候阻塞什么时候不阻塞呢写端未关闭时候阻塞等待直到有数据写入哪怕只写 1 字节读取后返回实际字节数写端关闭的时候管道空时read()立即返回 0EOF且后续再调用read()也一直返回 0除了上面易混淆的点再补充一点我对进程池的理解当任务来时开启进程任务结束时关闭进程这样会产生多次系统调用给系统带来更多负载而进程池可以先创建多个进程处于“随时待命”的状态减少多次“开启进程”“关闭进程”的动作减少操作系统的工作量。接下来是代码总结.├── Main.cc //测试├── Makefile├── ProcessPool.hpp //进程池代码└── Task.hpp //任务代码//ProcessPool.hpp #ifndef __PROCESS_POOL__ #define __PROCESS_POOL__ #include iostream #include cstdlib #include vector #include unistd.h #include Task.hpp #include sys/wait.h //管道封装 class Channel { public: Channel(int fd, pid_t id) : _wfd(fd), _subid(id) { _name channel- std::to_string(_wfd) - std::to_string(_subid); }; ~Channel() {}; void Send(int code) { int n write(_wfd, code, sizeof(code)); (void)n; } void Close() { close(_wfd); } void Wait() { pid_t rid waitpid(_wfd, nullptr, 0); } int FD() { return _wfd; } pid_t SubId() { return _subid; } std::string Name() { return _name; } private: int _wfd; pid_t _subid; std::string _name; // int nodenum }; class ChannelManager { public: ChannelManager() : _next(0) {}; void Insert(int wfd, pid_t subid) { _channels.emplace_back(wfd, subid); } Channel Select() { auto c _channels[_next]; _next; _next % _channels.size(); return c; } void PrintChannel() { for (auto channel : _channels) { std::cout channel.Name() std::endl; } } void StopSubProcess() { for (auto channel : _channels) { channel.Close(); std::cout 关闭: channel.Name() std::endl; } } void WaitSubProsess() { for (auto channel : _channels) { channel.Wait(); std::cout 回收子进程: channel.Name() std::endl; } } ~ChannelManager() {}; private: std::vectorChannel _channels; int _next; }; const int gdefaultnum 5; //默认开启进程数可改 //进程池 class ProcessPool { public: ProcessPool(int num) : _process_num(num) { _tm.Register(PrintLog); _tm.Register(Download); _tm.Register(Upload); } void Work(int rfd) { while (true) { int code 0; ssize_t n read(rfd, code, sizeof(code)); if (n 0) { if (n ! sizeof(code)) { continue; } std::cout 子进程[ getpid() ]收到到一个任务码: code std::endl; _tm.Execute(code); } else if (n 0) { std::cout 子进程退出\n; break; } else { std::cout 读取错误\n; break; } } } bool Create() { for (int i 0; i _process_num; i) { // 1.创建管道 int pipefd[2] {0}; int n pipe(pipefd); if (n 0) { return false; } // 2.创建子进程 pid_t subid fork(); if (subid 0) return false; else if (subid 0) { // 子进程 // 3.关闭不需要的文件描述符 close(pipefd[1]); Work(pipefd[0]); close(pipefd[0]); exit(0); } else { // 父进程 // 3.关闭不需要的文件描述符 close(pipefd[0]); _cm.Insert(pipefd[1], subid); } } return true; } void Debug() { _cm.PrintChannel(); } void Run() { // 1.选择一个任务 int taskcode _tm.Code(); // 2.选择一个信道[子进程]负载均衡的选择一个子进程完成任务 auto c _cm.Select(); std::cout 选择子进程 c.Name() std::endl; // 3.发送任务 c.Send(taskcode); std::cout 发送一个任务码 taskcode std::endl; } void Stop() { // 关闭父进程所有的wfd即可 _cm.StopSubProcess(); // 回收所有子进程 _cm.WaitSubProsess(); } ~ProcessPool() {}; private: ChannelManager _cm; int _process_num; TaskManager _tm; }; #endif//Task.hpp #pragma once #include iostream #include vector typedef void (*task_t)(); void PrintLog(){ std::cout 我是一个打印日志任务 std::endl; } void Download() { std::cout 我是一个下载的任务 std::endl; } void Upload() { std::cout 我是一个上传的任务 std::endl; } //////////////////////// class TaskManager { public: TaskManager() { srand(time(nullptr)); } void Register(task_t t) { _tasks.push_back(t); } int Code() { return rand() % _tasks.size(); } void Execute(int code) { if (code 0 code _tasks.size()) { _tasks[code](); } } ~TaskManager() {} private: std::vectortask_t _tasks; };//Main.cc #includeProcessPool.hpp int main(){ ProcessPool pp(gdefaultnum); pp.Create(); // pp.Debug(); int cnt 10; while (cnt--) { pp.Run(); sleep(1); } pp.Stop(); return 0; }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设免费空间注册导航PHP做网站的核心是什么

本地资源测试:Nagios插件的详细指南 在服务器监控领域,Nagios是一款广泛使用的开源监控工具,它提供了一系列插件来测试本地资源。这些插件主要用于测试那些没有自己网络协议、难以通过网络直接查询的本地资源,因此需要在被测试的计算机上进行本地安装。 远程测试的实现方…

张小明 2025/12/28 13:41:32 网站建设

盘锦做网站多少钱阿里云服务器网站备案

1. 煤矸石分拣机器人视觉识别系统:从模型到实战 当煤矿传送带上的煤矸石像巧克力豆一样翻滚时,如何让机器人像眼睛雪亮的老师傅一样准确分拣?🤖💎 今天就带大家揭秘这套超酷的煤矸石分拣机器人视觉识别系统&#xff0…

张小明 2025/12/28 17:36:08 网站建设

营销网站建设多少钱平台推广方式

WindowResizer终极指南:简单三步掌握窗口尺寸精准控制 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法调整大小的顽固窗口而烦恼吗?WindowRe…

张小明 2025/12/28 15:08:44 网站建设

惠州市网站制作有限公司nike建设网站的目的

Files性能优化终极指南:5分钟让你的老旧电脑重获新生 【免费下载链接】Files Building the best file manager for Windows 项目地址: https://gitcode.com/gh_mirrors/fi/Files 还在为文件管理器卡顿而烦恼吗?当你打开一个包含数百个文件的文件夹…

张小明 2025/12/29 22:23:47 网站建设

网站建设开票写什么网站推广排名优化多少钱

图文转视频全流程:最后一步交给 EmotiVoice 在短视频内容爆炸式增长的今天,一条高质量视频从策划到发布的周期被压缩到了以小时甚至分钟计。用户不再满足于静态图文的“看”,而是追求视听一体的“沉浸”。然而,真正让图文“活”起…

张小明 2026/1/8 11:08:14 网站建设

那一个网站可以教做甜品的wordpress大前端

Excalidraw LDAP用户目录对接实践 在企业协作工具日益普及的今天,如何在保障数据安全的前提下实现高效的团队协同,成为技术管理者面临的核心挑战之一。尤其对于重视数据主权与合规性的组织而言,直接使用公有云白板服务往往存在风险。Excalidr…

张小明 2026/1/2 17:43:42 网站建设