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

可以直接进入网站的代码cms网站后台模版

可以直接进入网站的代码,cms网站后台模版,看手机的网站,创建全国文明城市手抄报前言 之前我们学习了进程通过匿名管道进行通信#xff0c;实现了两个进程的数据传输。 如果我们管理的是很多个进程#xff0c;通过管道发送指令#xff0c;因为如果管道中没有数据#xff0c;读端必须等待#xff0c;也就是被管理的进程们都在等待我发送的指令#xf…前言 之前我们学习了进程通过匿名管道进行通信实现了两个进程的数据传输。 如果我们管理的是很多个进程通过管道发送指令因为如果管道中没有数据读端必须等待也就是被管理的进程们都在等待我发送的指令那么我们可以通过特定的通讯方式对进程实施控制也就是让进程根据传输的指令去完成相应的操作。 一、进程池概念 我们知道系统资源的获取是有成本的比如我们创建进程需要花一定的时间去完成比如现在我们有一些比较重要的任务需要处理如果等待任务到来再创建进程去处理任务时间上会慢一点如果我们提前将进程创建好任务到来我们直接对进程分派任务这样就能节省时间这些提前创建好并被管理的进程有任务来就分派执行我们可以称之为进程池。 打个比方比如说你喝娃哈哈矿泉水如果你感觉到口渴了才去外面超市买娃哈哈矿泉水这样成本是不是比较高有点浪费时间但是如果你提前在家里面放上一箱娃哈哈矿泉水渴了就喝顺手就拿的事情效率就提高了这也相当于把矿泉水进行池化了。 二、进程池实现 主要思路是先创建进程和信道再发布任务最后等待关闭父进程的写进程让子进程read读到0就退出子进程。最后父进程进行资源回收。 具体可以看代码注释这里就不多BB了 ProcessPool.cpp #include iostream #include unistd.h #include cassert #include cstdio #include cstdlib #include vector #include string #include sys/types.h #include sys/wait.h #include Task.hpp using namespace std;#define NUM 5class channel { public:channel(string name, int fd, pid_t pid): _name(name), _fd(fd), _pid(pid){}public:string _name;int _fd;pid_t _pid; };void Work() {while (true){int code 0;ssize_t n read(0, code, sizeof(code));if (n sizeof(code)){if (!init.Check(code)){cout 任务码不合法执行失败 endl;continue;}init.RunTask(code);}else if (n 0)break;} }void CreatProcess(vectorchannel v) {vectorint vfd; // 存放父进程的写信道的fdfor (int i 0; i NUM; i){// 创建管道int pipefd[2];int n pipe(pipefd);assert(n 0);// 创建进程pid_t id fork();if (id 0){perror(fork);exit(1);}// 构建信道else if (id 0){// 子进程vfd.push_back(pipefd[1]);for (auto fd : vfd) // 关闭子进程继承的写信道{close(fd);}dup2(pipefd[0], 0);Work();exit(0);}// 父进程close(pipefd[0]);v.push_back(channel(to_string(i 1) 号信道, pipefd[1], id));} }void PrintChannel(const vectorchannel v) {for (auto c : v){cout c._name , c._fd , c._pid endl;} }void SendTask(const vectorchannel v, bool flag, int num 1) {int pos 0;while (true){int task init.SelectTask(); // 选择任务pos % v.size(); // 选择信道轮流执行任务channel c v[pos];cout发送信息init.ToDesc(task)给c._namepid是c._pidendl;write(c._fd, task, sizeof(task)); // 发送任务if (!flag){if (--num 0)break;}sleep(1);}sleep(1);cout 发送任务完成 endl; }void WaitPorcess(vectorchannel v) {for (auto c : v){close(c._fd);pid_t rid waitpid(c._fd, nullptr, 0);cout等待子进程c._pid成功endl;} }int main() {vectorchannel channels;// 创建进程和信道CreatProcess(channels);// PrintChannel(channels); //打印测试// 发送任务const bool always_loop true;SendTask(channels, !always_loop, 10);// 进程等待回收WaitPorcess(channels);return 0; } Task.hpp #pragma once#include iostream #include functional #include vector #include ctimeusing namespace std;typedef functionvoid() task_t;void Download() {cout 我正在下载, pid: getpid() endl; }void Print() {cout 我正在打印, pid: getpid() endl; }void PlayVideo() {cout 我正在播放, pid: getpid() endl; }class Init { public:Init(){tasks.push_back(Download);tasks.push_back(Print);tasks.push_back(PlayVideo);srand(time(nullptr));}void RunTask(int code){tasks[code]();}string ToDesc(int code){switch (code){case 0:return Download;case 1:return Print;case 2:return PlayVideo;default:return Unkonw;}}bool Check(int code){return code 0 code tasks.size();}int SelectTask(){return rand() % tasks.size();}public:vectortask_t tasks;// 任务码const int download_code 0;const int print_code 1;const int PlayVideo_code 2; };Init init; 运行结果如下。
http://www.zqtcl.cn/news/846690/

相关文章:

  • 网站哪里买外链品牌网站设计步骤
  • 网站推广 优帮云淄博网站制作公司
  • 二手书哪个网站做的好wordpress 直排主题
  • 网站开发风险分析做情诗网站
  • 怎样可以快速增加网站的反链网络广告平台有哪些
  • 学校网站源码小游戏网站审核怎么做
  • 西乡网站建设政务网站开发协议
  • 美食网站开发环境北京app网站建设
  • 郑州网站建设推广渠道重庆网站建设公司下载
  • 宜宾营销型网站建设网站建设需要什么资质
  • 重庆建网站有哪些学跨境电商要多少钱
  • 上海建设钢结构工程网站深圳电器公司排名
  • 淄博网站建设找淄深网江苏省建设斤网站
  • 免费行情软件app网站红色西安做网站印象网络
  • 宁波网站建设小程序开发聊城wap网站建设
  • 陇南网站网站建设泰安网站的建设
  • 哪个网站有介绍拿到家做的手工活建设银行网站怎么修改手机号码吗
  • 网站地图怎么用淘宝客推广网站建设
  • 外贸零售网站建设购物网站支付功能怎么做
  • 淘宝客如何做自己的网站西宁工程建设招聘信息网站
  • 天津都有哪些制作网站郑州官网首页
  • 个人网站开发模式海南省建设公司官网
  • edu网站开发做爰视频在线观看免费网站
  • 安防公司网站模板网站建设模板下载
  • 贵阳网站建设方案维护一 建设茶叶网站前的市场分析
  • 山东东营建设网官方网站百度电脑版
  • 做网站前途如何海尔网站建设推广
  • 投资公司网站建设万网域名安装wordpress
  • 高端网站建设企业官网建设wordpress相似推荐
  • php网站开发师招聘wordpress怎么换头像