简易版的进程池

1.使用匿名管道实现 进程池

#pragma oncetypedef void(*task_t)();void task1()
{cout << "游戏 刷新日志" << endl;
}void task2()
{cout << "游戏 刷新野区" << endl;
}
void task3()
{cout << "游戏 检测软件是否更新,如果需要,就提示用户" << endl;
}
void task4()
{cout << "游戏 用户释放技能,更新用户的HP和MP"<<endl;
}
void Loadtask(vector<task_t> *tasks)
{tasks->push_back(task1);tasks->push_back(task2);tasks->push_back(task3);tasks->push_back(task4);
}//以上是头文件//以下是程序;
//类似于内存池,每次使用都不再向系统申请进程,而是提前储备进程;
#include<cstdlib>
#include<cassert>
#include<time.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<iostream>
#include<vector>
#include<string>
#include<unistd.h>using namespace std;
#include"main.h"
const int processnum = 5;//子进程数量=5
vector<task_t> tasks;  //任务列表,全局变量//先描述
class channel
{
public:channel(int cmdfd ,pid_t slaverid,const string &processname):_cmdfd(cmdfd),_slaverid(slaverid),_processname(processname){}
public:int _cmdfd;	//发送任务的文件描述符pid_t _slaverid; //子进程的pidstring _processname;//子进程的名字——方便我们打印日志;
};void slaver()
{//read(0);//直接从标准输入读while (true){int cmdcode = 0;int n = read(0,&cmdcode,sizeof(int));//如果父进程不给子进程发任务?就会阻塞等待;if (n == sizeof(int)){//执行cmdcode 对应的任务列表;cout << getpid() << ":cmdcode:" << cmdcode << endl;//查看父进程给子进程派发的任务码;if (cmdcode > 0 && cmdcode < tasks.size()) //满足条件运行函数;tasks[cmdcode]();}if (n == 0){break;}}
}
//函数传参,需要输入型,输出型,输入输出型参数;
//输入:const &: const引用
//输出:用指针
//输入输出:&引用
void InitProcessPool(vector<channel>* channels)
{//1.初始化for (int i = 0; i < processnum; i++){int pipefd[2];//临时空间;int n = pipe(pipefd);assert(!n);//判断是否成功;(void)n;pid_t id = fork();if (id == 0)//子进程读{close(pipefd[1]);dup2(pipefd[0], 0);//重定向,从标准输入中读close(pipefd[0]);slaver();//执行相对应的任务;cout << "process: " << getpid() << "quit" << endl;//打印子进程pid;退出进程;exit(0);}//父进程写入close(pipefd[0]);//添加channel字段;string name = "process-" + to_string(i);channels->push_back(channel(pipefd[1], id, name));}
}
void Debug(const vector<channel> &channels)
{//testfor (const auto& c : channels){cout << c._cmdfd << " " << c._slaverid << " " << c._processname << endl;}
}
void Menu()											//菜单
{cout << "1.刷新日志" << endl;cout << "2.刷新野怪" << endl;cout << "3.检测更新" << endl;cout << "4.更新状态" << endl;cout << "0.退出游戏" << endl;
}
//控制子进程
void ctrlSlaver(const vector<channel>& channels)
{int which = 0;//int cnt = 5;while(true){int select = 0;Menu();                              //手动控制cout << "please Enter@" << endl;cin >> select;if (select <= 0 || select >= 5) break;//select >0 &&select<5//1.选择任务//int cmdcode = rand() % tasks.size();//创造一个随机数,当作任务;int cmdcode = select-1;//2.选择进程(负载均衡:不可以一直给某个进程派发任务,其他进程都闲着,要均衡发展这个叫做负载均衡)1.使用随机数  2.轮转l来实现负载均衡//int processpos = rand() % channels.size();						//随机数//cout << "father say:" << "cmdcode:" << cmdcode << "already send to" << channels[processpos]._slaverid << endl;cout << "father say:" << "cmdcode:" << cmdcode << "already send to" << channels[which]._slaverid << endl;//轮转//3.发送任务//write(channels[processpos]._cmdfd, &cmdcode, sizeof(cmdcode));      //随机数版本write(channels[which]._cmdfd, &cmdcode, sizeof(cmdcode));			  //轮转which++;which %= channels.size();//cnt--;//sleep(1);}
}
void QuitProcess(const vector<channel> &channels)						//退出进程
{for (const auto& c : channels){close(c._cmdfd);}//sleep(5);for (const auto& c : channels) waitpid(c._slaverid, nullptr, 0);   //等待退出//sleep(5);
}int main()
{Loadtask(&tasks);							//加载任务参数;srand(time(nullptr) ^ getpid() ^ 1023);		//种一个随机数种子//再组织vector<channel> channels;//初始化-------bug?————画图就可以看出来,推荐画一下图!!!答:文件描述符随着创建子进程递增;InitProcessPool(&channels);					//初始化Debug(channels);							//测试//2.开始控制子进程ctrlSlaver(channels);						//控制子进程//3.清理收尾QuitProcess(channels);return 0;
}

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

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

相关文章

PyMuPDF 操作手册 - 05 PDF的OCR识别等

文章目录 六、PyMuPDF的OCR识别6.1 使用 Tesseract进行OCR6.2 使用MuPDF进行OCR6.3 使用 Python 包easyocr进行OCR识别6.4 使用 Python ocrmypdf包进行OCR识别6.5 将图像批量OCR并转换为PDF七、PDF附加、嵌入、批注等7.1 附加文件7.2 嵌入文件7.3 从文档中获取所有批注六、PyMu…

【链表经典面试题】LeetCode138.复制带随机指针的链表(链表深拷贝)

&#x1f4c7;文章目录 &#x1f680;题目描述&#x1f680;思路1&#xff1a;&#x1f680;思路2&#xff1a;&#x1f680;完整代码 &#x1f680;题目描述 解读&#xff1a; 题目意思就是 给你一个链表 这个链表中除了有next指针之外 还有一个指向这个链表的随机位置的一个指…

python读数据,并且 csv格式的,如何应对。

s545112015022319.txt 要求 通过python 导入程序 高度(距地) 时间 气温 气压 湿度 露点 温露差 虚温 风向 风速 纬度差 经度差 0 0 0.0 0.9 1015 38 -11.8 12.7 1.6 203 1 0.0 0.0 1 10 0.0 2.3 1014 37 -11.0 13.3 3.0 203 …

平安健康CEO李斗谈如何破解居家养老行业痛点,打造优质服务

在人口老龄化趋势日益加剧的背景下&#xff0c;居家养老服务正成为满足老年人生活需求的重要一环。平安健康作为行业的领军企业&#xff0c;自2021年起便积极布局居家养老服务市场&#xff0c;并于2022年推出服务品牌“平安管家”。经过两年多的发展&#xff0c;平安健康董事长…

虚函数 虚表指针

虚函数表和虚表指针 1&#xff0c;虚函数的含义 用virtual声明类的成员函数称之为虚函数 2&#xff0c;作用 用于实现多态 存在继承关系&#xff0c;子类继承父类 子类重写了父类的virtual function 子类以父类的指针或者引用的身份出现 3&#xff0c;虚函数的实现原理 其中的…

JavaScript知识点大总结来了-------这一篇就足够啦!!!

JavaScript基础知识 一、对象的使用 1、创建对象 这里创建对象的方法我们采用最常用的一种&#xff1a; //第一种 <script>var Person {name: "zhangsan",age: "19",weight: "140",hight: "170",print:function(){console.…

山东济南比较出名的起名大师的老师,中国最厉害的改名大师颜廷利:短命的小草,年年自损;长寿的大树,万古长青。。。(升命学说)

在中国第一起名大师的老师颜廷利教授的《升命学说》中&#xff0c;通过“净化论”、“和合法则”、“唯悟主义”以及“镜正理念”的阐述&#xff0c;我们得以窥见生命的不同维度。他以自然界中短命的小草与长寿的大树为例&#xff0c;揭示了生命形态的对比与哲理。 小草&#…

ADI Trinamic TMC2300 完美用于相机镜头的马达驱动芯片方案

TMC2300-LA是一款用于高达 1.2A RMS 的两相步进电机的低压驱动芯片&#xff0c;低电压的步进电机驱动器是用于电池供电的、空间和待机功率临界驱动器应用。它的静音驱动技术StealthChop™能够为便携式&#xff0c;家庭和办公应用程序的非窃听运动控制&#xff0c;确保安静&…

Java宝藏实验资源库(5)字符流

一、实验目的 掌握输入输出流的基本概念。掌握字符流处理类的基本结构。掌握使用字符流进行输入输出的基本方法。 二、实验内容、过程及结果 **12.12 (Reformat Java source code) Write a program that converts the Java source code from the next-line brace style to…

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具&#xff0c;该工具是一款GUI工具&#xff0c;可以帮助广大研究人员通过ETW&#xff08;Event Tracing for Windows&#xff09;扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图&#xff0c;该…

【DICOM】BitsAllocated字段值为8和16时区别

一、读取dicom C# 使用fo-dicom操作dicom文件-CSDN博客 二、DICOM中BitsAllocated字段值为8和16时区别 位深度差异&#xff1a; 当BitsAllocated为8时&#xff0c;意味着每个像素使用8位来表示其灰度值。这允许每个像素有2^8256种不同的灰度等级&#xff0c;适用于那些不需要高…

WPF 深入理解一、基础知识介绍

基础知识 本系列文章是对个人 B站 up 微软系列技术教程 记录 视频地址 https://www.bilibili.com/video/BV1HC4y1b76v/?spm_id_from333.999.0.0&vd_source0748f94a553c71a2b0125078697617e3 winform 与 wpf 异同 1.winform 项目结构 编辑主要是在 Form1.cs(页面)&#…

AI音乐革命:创意产业的新篇章

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛&#xff0c;特别是在音乐产业中&#xff0c;AI音乐大模型的涌现&#xff0c;正在重新定义音乐创作的边界。最近一个月&#xff0c;随着多个音乐大模型的轮番上线&#xff0c;素人…

顶顶通呼叫中心中间件-机器人测试流程(mod_cti基于FreeSWITCH)

感兴趣的话可以点后面链接添加联系方式顶顶通小孙 一、打开ccadmin-web并且创建分机 1、登录ccadmin-web 登录地址&#xff1a;http://ddcti.com:88 登录之后根据下图去登录ccadmin-web系统。 2、创建分机 点击呼叫中心 -> 点击分机设置 -> 点击新增&#xff0c;点击…

重新整理了新版JSON工具类和一些见解

封装好了&#xff0c;工具类&#xff0c;直接粘贴就好了:所需依赖 springboot&#xff0c;hutool package com.jmj.gulimall.product.utils;import cn.hutool.core.bean.BeanUtil; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annota…

技术管理转型之战:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策&#xff08;Rational Decision Making&#xff09;2. 有限理性&#xff08;Bounded Rationality&#xff09;3. 直觉决策&#xff08;Intuitive Decision Making&#xff09;4. 循证管理&#xff08;Evidence-Base…

一文读懂Java多线程并发之内存模型

什么是内存模型? Java内存模型(Java Memory Model)描述了Java编程语言中的线程如何与内存进行交互,是和多线程相关的一组规范,需要各个 JVM 的实现来遵守 JMM 规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。有了这些规范,即便同一个程序在不同操作系统的虚…

WHAT - HTTP keep-alive 持久性连接和内存泄漏问题

目录 一、介绍HTTP 持久性连接&#xff08;persistent connection&#xff09;实现细节示例持久性连接的优化管道化&#xff08;Pipelining&#xff09;HTTP/2 和 HTTP/3 二、Node.js HTTP Agent 开启 keepAlive 导致的内存泄漏问题Node.js HTTP Agent 和 Socket 池Keep-Alive …

聚焦 Navicat 17 新特性 | 查询与配置的革新之处

随着 Navicat 17 的发布&#xff0c;引起业界热烈讨论与关注&#xff0c;这也标志着 Navicat 的产品力再次飞跃。新版本引入的众多创新特性极大地提升了用户在数据库管理和数据分析方面的体验&#xff0c;涵盖模型设计与同步、数据字典、数据分析&#xff08;data profiling&am…

图说SpringCloudStream消息驱动

SpringCloud Stream消息驱动实现原理 通过定义Binder绑定器作为中间层&#xff0c;实现了应用程序和消息中间件之间实现细节的隔离。通过向应用程序暴露统一的Channel通道&#xff0c;可以让应用程序不再需要考虑各种不同的消息中间件实现的兼容性问题。当需要升级消息中间件&a…