设计模式的C++实现(0)——初识设计模式
《设计模式的C++实现》为作者对系列博客的又一次尝试:在开发过C++基于多设计模式下的同步&异步⽇志系统🔗后,作者接触到了《设计模式》这本书,颇有感触,于是决定写博客来记录读后的灵感,然而随着博客内容的不断丰富,单篇的博客已经承载不下如此多样的内容,各种各样的设计模式便是一个典例,所以我决定将设计模式相关的博客拆成一个系列博客 目录:TODO 知识基础本系列博客着重于经典设计模式的介绍和运用C++类和对象技术将其实现,所以要求读者已经能够熟练掌握C++类和对象技术。并且当我们提及抽象类,多态,或者继承,虚函数的声明与实现等概念时,你应当已经对这些概念了然于心,而不是一知半解,还要查资料复习 设计模式从何而来设计模式描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们往往并不是人们从一开始就采用的设计方案,它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的艰苦努力。设计模式所做的事,就是捕获这些解决方案,并用简洁易用的方式表达出来。 学习目标设 ...
【代码整理】同步&异步⽇志系统的代码复盘
在项目的介绍博客🔗中,我们着重于代码功能的实现,而对项目代码整体的结构和风格欠缺重视,使其可读性有所欠缺,代码规范性也有所不足。所以在这篇博客中,我们将按上篇博客编写代码的顺序,再一次回顾写好的代码,并着重于: 调整代码结构 增加必要注释,删除冗余注释 添加必要的小括号,突出优先级 将代码的简便写法改写回易读的写法 实用类 增加功能简介 增加注释 增加空行12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#pragma once#include <iostream>#include <fstream>#include <sstream>#include <string>#include <ctime>#include <cassert>#include <sys/stat ...
初识Linux套接字(socket)和TCP/UDP协议
这是系列博客中的第二篇,导航如下 初识计算机网络🔗 初识Linux套接字(socket)和TCP/UDP协议🔗 👈您在这里 在Linux环境中,套接字(Socket)是一种用于进程间通信(IPC)的机制,但这里的进程,包括了同一网络下其它主机的进程,所以它被广泛应用于网络编程。它允许不同计算机上的进程或同一计算机上的不同进程之间进行数据交换。 由于此时我们的网络编程基础较少,所以本文的内容更偏向于实践,而不是原理。希望能在动手实践中加深对网络编程的熟悉程度,减少陌生感 在本文中,我们将: 知识铺垫:认识IP地址, 端口号, 网络字节序等网络编程中的基本概念(简略) socket API学习 实现一个简单的UPD客户端/服务器 实现一个简单的TCP客户端/服务器(服务器包括单连接版本,多进程版本,多线程版本) 知识铺垫理解源IP地址和目的IP地址在数据包的头部中,包含两个IP地址,分别叫做源IP地址和目的IP地址 为什么要有两个IP地址?因为一般通过网络建立的通信都是双向的,而且一方接收请求后,一般还要把响应发送回去,所以含有两个IP地址才 ...
初识Linux编程&初识makefile
前言本文将以实用的视角,以快速上手Linux平台的C++编程为目的,介绍: Linux的基本操作 gcc/g++的常用指令 makefile的常用编写方式 软件准备如果选择用虚拟机,那请自己解决 这里介绍使用Linux服务器配合本地ssh链接软件的方式在服务器上编写代码 首先是服务器,可以在主流服务器平台(阿里云,腾讯云,华为云)等购买服务器,一般有学生认证会更便宜,服务器配置不限,若要使用Linux,可以选择Ubuntu内核,(CentOs也行,就是太老了,且停止维护了),然后自行查阅相关教程,设置默认管理员账户和密码,以及配置服务器,开启ssh远程链接权限 关于本地的ssh链接软件,这里我只推荐两个我使用过的 xshell7 vscode+ssh插件 其中xshell比较简单,安装好就能用 戳我去下载免费版xshell🔗,怎么登录服务器?自行百度~。但缺点是仅支持控制台,所以写代码只能用vim等支持控制台的文本编辑器 vscode+ssh插件会比xshell麻烦点,还要修改配置文件,具体教程可参考b战视频🔗 但优点是vscode在支持终端(控制台)的同时还支 ...
设计模式的C++实现(2)——代理模式
代理模式 模式名称: 代理模式-Proxy类型: 结构型问题-使用场景: 在执行类和用户间再增加一个中间人,执行类的交互对于用户来说过于复杂,执行类的接口对参数检查较严格等解决方案: 可以封装一个类,为用户提供更简洁的接口,而与执行类的交互在其内部实现;或者封装一个头文件,在里面封装全局函数和宏函数等效果: 增加代码复杂性,封装层数更高,更加抽象。具体实现方式十分多样,增加了代码编写者的工作,但减少了用户的使用难度,也能一定程度上提高安全性 代理模式指代理控制对其他对象的访问, 也就是代理对象控制对原对象的引⽤。在某些情况下,⼀个对象不适合或者不能直接被引⽤访问,⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象 按照编译时和运行时的行为,代理模式分为静态代理、动态代理: 静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经确定了代理类要代理的是哪个被代理类。 动态代理指的是,在运⾏时才动态⽣成代理类,并将 ...
设计模式的C++实现(1)——单例模式
单例模式介绍 模式名称: 单例模式-Singleton类型: 创建型问题-使用场景: 希望一个类在全局只实例化出一个对象解决方案: 使用静态成员,将构造函数私有化,删除拷贝构造和opetator=()函数效果: 略微增加代码复杂性,使用了静态成员变量/函数。但是能够保证该类只会有一个实例。 ⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个访问它的全局访问点,该实例被所有程序模块共享。⽐如在某个服务器程序中,该服务器的配置信息存放在⼀个⽂件中,这些配置数据由⼀个单例对象统⼀读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种⽅式简化了在复杂环境下的配置管理。 单例模式有两种实现模式:饿汉模式和懒汉模式 饿汉模式饿汉模式中,程序启动时就会创建⼀个唯⼀的实例对象。 因为单例对象已经确定, 所以⽐较适⽤于多线程环境中, 多线程获取单例对象不需要加锁, 可以有效的避免资源竞争,⾼性能。 123456789101112131415161718template<typename T>class Singleton &# ...
设计模式的C++实现(3)——工厂模式与建造者模式
模式名称: 工厂模式-Factory类型: 创建型问题-使用场景: 当创建不同对象的过程过于复杂,或者需要隐藏/封装创建对象的具体过程,或需要创建同一家族的产品(对象)时解决方案:将创建对象的过程封装到工厂类内,并提供设置创建不同对象的接口效果: 简化了用户操作,使创建对象,创建多个不同的对象更为简单易用,提高了代码的封装性。但是代码复杂性大大提高,类封装的层次更多了,可扩展性会有所欠缺。 模式名称: 建造者模式-Builder类型: 创建型问题-使用场景: 当创建不同对象的过程过于复杂,或者需要隐藏/封装创建对象的具体过程,或需要创建同一家族的产品(对象)时解决方案:将创建对象的过程封装到Builder内,并提供设置创建不同对象的接口,以及提供不同的Builder派生类,最后提供一个指挥者类统一指挥对象的创建效果: 可扩展性强的同时,简化了用户操作,使创建对象,创建多个不同的对象更为简单易用,提高了代码的封装性。但是代码复杂性大大提高,类封装的层次更多了。 ⼯⼚模式是⼀种创建型设计模式, 它提供了⼀种创建对象的最佳⽅式。在⼯⼚模式中,我们创建对象时不会对上 ...
【版本v1.0】C++基于多设计模式下的同步&异步⽇志系统
前置知识 Linux日志器(简易版) 初识Linux线程 初识设计模式&单例模式&代理模式–设计模式介绍(1) 工厂模式与建造者模式–设计模式介绍(2) 项目介绍背景引入 日志系统在软件开发和运维中扮演着至关重要的角色,主要体现在以下几个方面: 问题排查和调试:日志记录了系统运行过程中的重要信息,包括错误信息、异常堆栈、接口调用信息等。开发人员可以通过分析日志快速定位问题,减少排查时间,提高开发效率。 性能监控:通过记录应用程序的性能指标(如响应时间、请求吞吐量等),开发团队可以监控系统的健康状态,发现性能瓶颈并进行优化。 安全审计:日志可以记录用户的操作和系统事件,为后期的安全审计提供依据。一旦发生安全事件,通过分析日志可以追踪到攻击来源和攻击方式。 用户行为分析:通过对日志进行分析,开发团队可以了解用户的使用习惯和需求,这有助于改进产品功能和用户体验。 合规要求:在许多行业中,日志记录是合规的要求之一。维护完整的日志记录可以帮助企业满足法律法规和行业标准。 系统健康监控:通过实时监控日志,可以及时发现系统异常,进行预警和自动化处理,从而提高系统的可用性和稳定性。 ...
【保持最新】C++基于多设计模式下的同步&异步⽇志系统
当前版本v1.0 前置知识 Linux日志器(简易版) 初识Linux线程 初识设计模式&单例模式&代理模式–设计模式介绍(1) 工厂模式与建造者模式–设计模式介绍(2) 项目介绍背景引入 日志系统在软件开发和运维中扮演着至关重要的角色,主要体现在以下几个方面: 问题排查和调试:日志记录了系统运行过程中的重要信息,包括错误信息、异常堆栈、接口调用信息等。开发人员可以通过分析日志快速定位问题,减少排查时间,提高开发效率。 性能监控:通过记录应用程序的性能指标(如响应时间、请求吞吐量等),开发团队可以监控系统的健康状态,发现性能瓶颈并进行优化。 安全审计:日志可以记录用户的操作和系统事件,为后期的安全审计提供依据。一旦发生安全事件,通过分析日志可以追踪到攻击来源和攻击方式。 用户行为分析:通过对日志进行分析,开发团队可以了解用户的使用习惯和需求,这有助于改进产品功能和用户体验。 合规要求:在许多行业中,日志记录是合规的要求之一。维护完整的日志记录可以帮助企业满足法律法规和行业标准。 系统健康监控:通过实时监控日志,可以及时发现系统异常,进行预警和自动化处理,从而提高系 ...
Cpp售货机类模拟实现
这是一篇复习类的博客,主要综合运用以下知识: 格式化输入输出及打印菜单 类的封装 类的组合 子函数概念 共享指针 lambda表达式 头文件为了简便,就把类的声明和实现写在同一个VendingMachine.h文件里了 12345678#pragma once#include <string>#include <vector>#include <unordered_map>#include <iostream>#include <algorithm>#include <windows.h>using namespace std; //展开std命名空间 这里一次性给出所用的头文件,后文便不再添加了 封装商品类售货机当然要管理商品啦,那怎么管理呢?依然是先描述,再组织 怎么描述?把它封装成商品类 1234567891011struct Item{public: Item(const string& name,double price,int cnt) :_name(name),_price( ...
初识计算机网络
—-这是第一条ARPANET信息,发送于1969年10月29日,从加州大学洛杉矶分校(UCLA)发往斯坦福大学。这条消息本来想说的是“登录”(LOGIN),但是系统崩溃了。 因特网初创于20世纪60年代,其初衷在于建造一个网络来连接分散在不同地理位置的计算机 如今的因特网由几百万个松散连接的独立网络构成,其中的每个网络都连接到另外一个或多个网络。邻近的计算机通过本地的局域网相互连接,这些局域网通常为无线以太网。网络之间通过网关或路由器相互连接。网关和路由器是专用的计算机,用来把组成信息的数据包从一个网络指引到下一个网络。(维基百科上说网关是通用设备,而路由器是其中的特例,其用途并不通用。)网关之间互相交换着路由信息,这样它们就至少知道哪些网络与本地网络相连并可以被访问到。 计算机网络背景网络发展 独立模式:计算机之间相互独立 网络互连:多态计算机连接在一起,完成数据共享 例如网吧的无盘系统,同一个房间的所有电脑连在一起,共享硬盘 局域网LAN: 网络中计算机的数量更多了,通过交换机和路由器连在一起 广域网WAN:通过局域网的层层相连,将相隔千里的计算机连在 ...
网络股票信息爬虫与可视化
背景分析背景概述在当今快速发展的金融市场中,股票市场的动态变化对投资者和金融分析师至关重要。随着信息技术的进步,特别是互联网和大数据技术的发展,投资者可以实时获得大量的股票市场信息。然而,这些信息通常以原始数据形式存在,需要进一步处理和分析才能提取有价值的洞见。在这种背景下,网络股票信息爬虫与可视化技术应运而生,成为股票市场分析的重要工具。 网络股票信息爬虫网络股票信息爬虫(Web Scraping)是一种自动化的数据收集技术,旨在从互联网上提取股票市场相关的信息。它利用程序化方法访问和抓取各种金融网站和新闻平台上的数据,例如股票价格、交易量、公司财报、新闻动态等。爬虫技术可以高效地从大规模数据源中获取最新的信息,支持实时数据更新和历史数据回溯分析。 关键技术: 爬虫框架:如Scrapy、BeautifulSoup等,用于解析HTML页面和提取数据。 由于本文的目标网站的股票数据并不在页面中,也就是说不需要做网页分析和提取 API接口:一些金融网站提供API接口,允许程序直接获取结构化的数据。 (例如本文使用Get方法的https请求,获取了json文件) 数据存储:抓取的数 ...
【python项目实践】ACVA航空公司客户价值分析
背景分析航空公司现状行业内竞争民航的竞争除了三大航空公司之间的竞争外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价格、服务间的竞争逐渐转向对客户的竞争 行业外竞争随着高铁、动车等铁路运输的兴建,航空公司受到巨大冲击 如上图所示,经过2010到2015年的发展,铁路运输对航空运输的冲击越发明显 航空公司数据特征说明 目前航空公司已经积累了大量的会员档案信息和其乘坐航班记录 就本项目已获取的数据,以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成的历史数据,44个特征,总共62988条记录。 数据特征记录说明如下表所示: 结合数据的项目目标结合目前航空公司的数据情况,可以实现以下目标 借助航空公司客户数据,对客户进行分类 对不同的客户类别进行特征分析,比较不同类别客户的客户价值 对不同价值的客户类别提供个性化服务,制定相应的营销策略 了解客户价值分析客户营销战略倡导者Jay & Adam Curry 从国外数百家公司进行 ...
手撕红黑树
红黑树虽然AVL树作为绝对的平衡搜索二叉树,有着极高的查询效率,但正因为其严格的要求,修改AVL树的某个结点时,可能要一路调整到根节点,效率低下。为了解决这一痛点,略微没那么严格的近似平衡搜索二叉树,即红黑树被提出 红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 红黑树的性质首先与一般的定义不同,在红黑树中将空指针(上图为NIL)作为叶子节点,然后我们来讨论具体的性质 每个结点不是红色就是黑色 根节点必定是黑色的 如果一个结点是红色的,则它的两个孩子结点是黑色的 对于每个结点,该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 每个叶子结点都是黑色的此处的叶子结点指的是空结点NIL 思考:为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍? 红黑树的性质保证了从根节点到所有叶子结点(空结点)的路径上,包含相同数量的黑色结点。这是红黑树平衡性的重要保证 ...
C++继承
继承的概念及定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用 下面用一个简单的示例演示一下继承示例 1234567891011121314151617181920212223242526272829303132333435#include <iostream>#include <string>using namespace std;class Person{public: void Info() { printf("name:%s age:%d\n", _name.c_str(), _age); }protected: string _name = "supdriver"; int _age = 24;};class Student: ...
Linux原生线程 与 互斥锁
什么是线程在一个程序(进程)里的一条执行流就叫做线程(thread),也就是说有多线程功能的进程内,可以有多个线程同时执行 所以我们可以认为: 一个进程至少有一个执行进程 线程在进程内部运行,本质是在进程提供的地址空间内运行 而对于Linux实现的线程,本质上是轻量化的进程,还是用的task_struct去维护的每一个线程 关于线程间内存共享如上图所示,线程之间只有栈区是相互独立的, 像是全局变量,堆区数据都是共享的 线程的优点 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多 能充分利用多处理器的可并行数量 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现 I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。 线程的缺点性能损失一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较 ...
Ssystem V 共享内存
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据,而是直接使用内存中的共享区。 我们接下来认识一下常用的接口 接口shmget 创建共享内存需要同时引入<sys/ipc.h> <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); key 是生成共享内存标示符的 关键字,唯一的key值能返回唯一的共享内存标示符,这是获得同一个共享内存的关键参数 size是指共享内存的大小,按字节算 shmflg是一个位图,控制创建时的行为和 共享内存文件的权限(缺省时为0),常见选项如下 IPC_CREAT:单独一个时,如果申请的共享内存不存在,就创建,然后返回;若存在,则获取并返回 IPC_CREAT | IPC_EXCL: 如果申请的共享内存不存在,则创建;若存在,则出错并返回-1 IPC_EXCL:不能单独使用 IPC_CREAT | 0666:创建一个权限为0666的共享内存文件,注: ...
Linux日志系统
引入首先看看AI对日志系统的重要性是怎么解释的 日志系统在软件开发和运维中扮演着至关重要的角色,主要体现在以下几个方面: 问题排查和调试:日志记录了系统运行过程中的重要信息,包括错误信息、异常堆栈、接口调用信息等。开发人员可以通过分析日志快速定位问题,减少排查时间,提高开发效率。 性能监控:通过记录应用程序的性能指标(如响应时间、请求吞吐量等),开发团队可以监控系统的健康状态,发现性能瓶颈并进行优化。 安全审计:日志可以记录用户的操作和系统事件,为后期的安全审计提供依据。一旦发生安全事件,通过分析日志可以追踪到攻击来源和攻击方式。 用户行为分析:通过对日志进行分析,开发团队可以了解用户的使用习惯和需求,这有助于改进产品功能和用户体验。 合规要求:在许多行业中,日志记录是合规的要求之一。维护完整的日志记录可以帮助企业满足法律法规和行业标准。 系统健康监控:通过实时监控日志,可以及时发现系统异常,进行预警和自动化处理,从而提高系统的可用性和稳定性。 故障恢复:在系统出现故障时,日志记录可以帮助开发和运维人员还原问题发生前的状态,从而有助于快速恢复系统。 总之,良好的日志系统能够帮助开发 ...
手撕AVL树
AVL树的概念二叉搜索树的不足二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。 AVL树的提出两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即构建一颗绝对的平衡搜索二叉树,即可降低树的高度,从而减少平均搜索长度。 定义: 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在O(log_2 n),搜索的时间复杂度O(log_2 n) 封装AVL树头文件12#include <utility>#include <cassert> 封装AVL树的节点 这里采用键值(KV)类型的二叉树节点,使其泛用性更高 ...
C++特殊类的设计
接下来我们设计一些C++的常用特殊类,同时加深对C++类和对象的理解 设计一个不能被拷贝的类拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C++98 将拷贝构造和赋值重载只私有声明且不定义即可 分析: 设为私有:防止类外调用,还能防止类外定义重新实现拷贝功能 只声明不定义:防止类内成员函数对其调用1234567//C++98class NoCopy{private://设置成私有 NoCopy(const NoCopy&); NoCopy& operator=(const NoCopy&);//只声明不定义}; C++11 C++11扩展了delete关键字的用法,可用于删除成员函数,尤其是删除默认成员函数 123456//C++11class CopyBan{ CopyBan(const CopyBan&) = delete; CopyBan& operator=(const CopyBan&) = delet ...
进程间通信
本篇博客更偏向于总括和导航,部分概念更细致的介绍将内嵌链接在文章中 重点内容 初识进程间通信 管道 消息队列 共享内存 信号量 进程间通信的目的 数据传输: 一个进程需要将它的数据发送给另一个进程 资源共享: 多个进程之间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如子进程终止时要通知父进程) 进程控制: 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程间通信的主要方式 管道 System V进程间通信 POSIX进程间通信 进程间通信的分类管道 匿名管道 命名管道 System V IPC System V 消息队列 SysTem V 共享内存 System V 信号量 POSIX IPC 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 管道怎么使用?戳我去管道博客🔗 首先,管道是Unix中最古老的进程间通信的形式。它用于进程间的单向通信 那么具体是怎样实现的呢?从标题里就可以发现,是基于文件 既然一个文件可以被多个进 ...
进程间通信--匿名管道与命名管道
什么是管道文件首先,管道是Unix中最古老的进程间通信的形式。它用于进程间的单向通信 那么具体是怎样实现的呢?从标题里就可以发现,是基于文件 既然一个文件可以被多个进程打开,那么不妨将文件作为两个进程通信的媒介。但是一般位于磁盘上的文件,IO效率相比于CPU,内存之类的读写速度慢了几个数量级,但文件是可以被加载到内存中的,而专门建立在内存中,而没有磁盘文件,专门用于进程间通信的内存级文件,我们就叫它管道文件 管道文件由内核维护 管道文件是单向的,可以是父进程->子进程,也可以子进程->父进程 管道读写规则 写端未关闭,但读端无数据可读时 (默认)O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。 O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。 读端未关闭,但写端写入管道已经写满时 (默认) O_NONBLOCK disable: write调用阻塞,直到有进程读走数据 O_NONBLOCK enable:wrtie调用返回-1,errno值为EAGAIN 若写端关闭,则read返 ...
【Linux】简易进程池
原理匿名管道可用于父子进程间的通讯,于是可以有父进程创建多个子进程形成进程池,并通过匿名管道文件向各个子进程派发任务 戳我去管道原理🔗 这里使用C++编写进程池代码,在程序中创建多个进程,并在父进程中使用自定义类channel用于描述和管理子进程,然后在task.hpp中模拟一些任务给主程序随机派发 代码代码规范这次对形参有了新的规范,这里用variable代指形参名 输入: const &variable 输出: *variable 输入输出: &variable 准备makefile文件这里使用g++编译,规定语法标准为C++11 123456processPool:processPool.cc g++ -o $@ $^ -std=c++11.PHONY:cleanclean: rm -rf processPool 准备任务文件首先要准备前后需要用到的头文件,然后构建模拟任务,并提供加载任务列表的函数 task.hpp 12345678910111213141516171819202122232425262728293031323334353637383 ...
【数据结构】一步到胃,键值对版二叉搜索树
什么是二叉搜索树二叉搜索树的定义是一颗二叉树的所有节点满足:根的左右孩子存在时,满足 左孩子 < 根 < 右孩子 递归定义则是: 左子树的根 < 根 < 右子树的根 左子树是二叉搜索树,右子树是二叉搜索树 写一个验证二叉搜索树的函数Leetecode题目链接🔗 封装一个二叉树类文件布置 BSTree.h用于声明和实现BSTree类 test.cpp用于测试 头文件BSTree.h 123#include <iostream>#include <utility> test.cpp 1#include "BSTree.h" 命名空间1namespace key_value 这里使用key_value作为命名空间,表示这是键值表示的搜索二叉树 定义节点二叉树的节点用于储存键值对和左右指针,并提供默认构造函数,使用初始化列表初始化成员变量 123456789101112131415template<class K,class V>class BSTNode{public: BSTNode(c ...
avatar
副驾supdriver
动物界 脊索动物门 哺乳纲 灵长目 人科 人属 智人种
我github还蛮大的
公告
主域名:
supdriver.top
网站资讯
文章数目 :
75
已运行时间 :
本站总字数 :
188k
本站总访问量 :
最后更新时间 :