自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点

【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点

2024-01-03 03:09:29 4854

原创 基于C++重构muduo网络库搭建HTTP服务器项目设计及反思

为什么要做muduo库呢?在后端开发中,服务器往往是基于如httplib库、muduo库等基础组件的基础上进行搭建的。选择重构muduo库,我们不仅可以借此机会了解网络库底层的实现逻辑以便于我们日后进行服务器的搭建,更重要的,我们可以学习muduo库中高效的事件驱动、多线程并发处理等优秀的设计理念。同时,可以加深我们对Epoll LT与ET模式、主从Reactor模式、非阻塞I/O读取、线程池,TCP、HTTP协议等等知识的巩固和掌握。在本项目中,我们将基于重构的muduo网络库搭建一个HTTP服务器件。

2025-02-17 16:21:22 937

原创 【C++】std::sort为何要求严格弱序

什么是严格弱序呢?假设 compare 是一个比较函数,对于任意的对象 a、b 和 c,compare(a, b) 的结果是一个布尔值,表示 a 是否在 b 之前。严格弱序需要满足以下四个条件:非自反性(Irreflexivity):对于所有 a,compare(a, a) 必须为 false。这意味着没有任何对象比自己小。反对称性(Antisymmetry):如果 compare(a, b) 为 true,那么 compare(b, a) 必须为 false。这意味着如果 a 在 b 

2025-02-09 15:08:39 687

原创 谈谈std::bind当绑定参数为值时可能会发生的问题,std::ref的恰当使用;

值绑定会复制参数的值,导致回调函数中使用的是副本,可能无法访问原始对象的最新状态。引用绑定通过std::ref或std::cref包装参数,可以避免对象的复制,确保回调函数中使用的是原始对象。

2025-01-15 02:43:32 1007

原创 从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

我们来回顾使用epoll的流程:1、首先,创建监听套接字,将其设置为读事件关心并挂载到epoll的红黑树中。监听套接字读取事件就绪的条件是:TCP全连接队列不为空,在LT模式下,只要全连接队列中有数据就满足读时间就绪;在ET模式下,只有当全连接队列中有新连接到来时,才会触发一次读时间就绪。2、当触发监听套接字读时间就绪后,使用epoll_wait从epoll模型的就绪队列中将就绪事件及其对应的套接字提取出来,根据套接字类型的不同和就绪事件的不同进而执行不同的回调函数。

2025-01-13 12:26:48 1338

原创 【C++】any类的介绍与模拟实现

std::any是 C++17 引入的一个标准库类型,用于表示一个可以存储任意类型数据的容器。与不同,std::any不限制存储的类型,因此它可以用来存储任意的对象。它的设计目标是提供一种简单的方式来存储和检索任意类型的值,而不需要像void*那样手动管理类型信息。

2025-01-09 17:14:46 1375

原创 时间轮思想与定时器的使用

时间轮结构:时间轮通常是一个环形结构,由多个槽组成,每个槽代表一个时间单位(如10ms、1s等)。每个槽中可以存储多个定时任务,这些任务在对应的时间单位到期时会被触发。时间轮的粒度:时间轮的粒度决定了每个槽代表的时间长度。例如,如果粒度是10ms,那么每个槽代表10ms。选择合适的时间轮粒度非常重要,过细的粒度会增加内存消耗,过粗的粒度可能无法满足精度要求。时间轮的级联:为了支持更长的定时时间,可以将多个时间轮级联起来,形成多级时间轮。每一级时间轮负责不同时间范围的定时任务。

2025-01-07 00:16:47 1090

原创 【Leetcode】单词拆分:dfs解法、dp解法

对于本题,我们想求字符s能否被字典中的单词成功拼接,可以将其拆分成如下子问题:设index为字符串的下标,start为起始位置(假设start从1开始,具体由自己设置),end为末尾位置,start

2025-01-06 18:29:05 895

原创 【数据结构】Trie字典树(前缀树)— 数组实现

字典树(Trie),又称前缀树或单词查找树,是一种树形数据结构。字典树的特点是每个节点代表一个字符,从根节点到叶子节点的路径表示一个完整的字符串(或单词)。字典树主要用于高效地存储和检索字符串集合。字典树的核心思想是通过共享字符前缀来减少存储空间和提高查询效率。例如,如果多个字符串共享相同的前缀(如 “cat” 和 “car” 共享 “ca”),那么在字典树中,这些前缀只会存储一次。假设插入的顺序为:“cat”,“dog”,“door”,“deer”,“pan”,“panda”。就会形成如下字典树。

2024-12-29 17:23:05 1127

原创 const与constexpr

const用于声明常量变量,可以在编译时或运行时初始化。适用于需要在运行时确定值的情况。不能用于需要编译时常量表达式的地方。constexpr用于声明编译时常量变量和函数。确保值在编译时确定。适用于需要编译时常量表达式的地方,如数组大小、枚举值、模板参数等。

2024-12-29 15:25:13 422

原创 ARP协议及其具体过程

同一子网内的通信:设备A和设备B直接通过交换机进行通信,ARP请求和数据传输都在同一子网内完成,不需要路由器的介入。跨子网的通信:设备A需要通过路由器将数据包转发到目标子网,路由器负责确定下一跳地址并进行数据包的转发。同一子网内的通信:设备A直接通过ARP解析目的设备B的MAC地址,并封装数据包发送给设备B。跨子网的通信:设备A通过ARP解析默认路由器的MAC地址,将数据包发送给路由器。路由器根据路由表确定下一跳设备,并将数据包转发到目标子网中的设备C。

2024-12-20 16:54:31 1571

原创 【dp】LeetCode 72:编辑距离

我们定义lena和lenb分别为两个字符串的长度,那么求解Question(lena - 1, lenb - 1),Question(lena , lenb - 1),Question(lena - 1, lenb)就是缩小条件后的子问题,Question(0, 0)就是最小的子问题。通过观察,当word1为空时,word1所转换为word2的字串所需要的最小的操作次数即为word2字串的长度。3、求解简单子问题,判断是否有可以直接求解的子问题。三、求解简单子问题,判断是否有可以直接求解的子问题。

2024-11-24 19:38:24 579 1

原创 【多状态dp】买卖股票的最佳时机III

在我们的状态定义中,我们假设一天可以进行多次交易。正因为如此,如果当前最大利润出现在第一次交易完成之后,我们第二次交易的完成也可以在同一天进行,即当天买入当天卖出,此时完成了第二次交易且所获利润为0。(虽然这是不现实的,但这是为了确保状态转移的正确性)。这样,我们可以在后续的动态规划过程中逐步更新状态,最终得到正确的最大利润。如此初始化的目的是为了确保我们在动态规划的初始阶段有一个合理的起点。这个值已经考虑了所有可能的交易组合,并且确保了通过两次交易可以获得的最大利润。即一天中可以完成多次交易。

2024-11-19 23:45:53 223

原创 【Linux】网络编程:应用层协议—HTTP协议(超详细)

HTTP(Hyper Text Transfer Protocol),全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0。协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则

2024-11-05 14:07:01 1292

原创 【Linux】网络编程:实现一个简易的基于HTTP协议格式、TCP传输的服务器,处理HTTP请求并返回HTTP响应;GET方法再理解

下述符号为HTTP请求和应答格式中的常用符号,为了方便提前定义出来。

2024-11-05 14:04:37 1437

原创 模板方法模式

模板方法模式通过定义一个算法的骨架,并允许子类实现其中的具体步骤,实现了代码的复用和扩展。算法的整体步骤稳定,但某些步骤的具体实现需要灵活变化。希望子类在不改变算法结构的情况下,重新定义算法的某些步骤。需要控制子类的扩展,只允许在特定的点进行扩展。模板方法模式在实际开发中常用于框架设计,如游戏引擎的关卡加载流程、Web框架的请求处理流程等。通过模板方法模式,框架可以提供一个稳定的算法骨架,而具体的实现细节由使用者来决定。

2024-10-30 17:14:27 426

原创 工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式:通过一个工厂类根据参数创建不同类型的产品,客户端只需知道工厂类。工厂方法模式:定义了一个工厂接口,每个具体工厂负责创建特定的产品,便于扩展新产品类型。抽象工厂模式:主要用于创建一组相关的产品,通过具体工厂类实现,可以同时创建多个相关的产品,确保产品之间的兼容性。

2024-10-30 17:12:58 1349

原创 【Linux】网络编程:初识协议,序列化与反序列化——基于json串实现,网络通信计算器中简单协议的实现、手写序列化与反序列化

在日常生活中,我们无时无刻不在遵守着“协议”。例如:当你点外卖时,你提前告知骑手要把外卖放在小区的5号外卖柜中。当外卖平台给你发送“订单已送达”信息后,你会前往5号外卖柜取出你的外卖。为什么不去6号外卖柜取走你的外卖呢?因为你和骑手已经事先约定好将外卖放在5号外卖柜中,这就是你和该名骑手间事先约定好的“协议”,双方必须同时遵守这一规则,这样才能保证资源处理的正确性。协议(Protocol)在计算机科学和通信领域中,指的是一组规则或标准,用于规定数据如何在不同的系统、设备或进程之间进行交换和处理。

2024-10-30 17:10:22 1313

原创 Jsoncpp使用简介

表示 JSON 数据中的各种值类型。:用于解析 JSON 字符串。和:用于将对象转换为 JSON 字符串。和:提供了更灵活的 JSON 解析选项。

2024-10-30 00:40:25 1230

原创 【Linux】网络编程套接字Socket:TCP网络编程

TCP(传输控制协议)和UDP(用户数据报协议)是计算机网络中最常用的两个传输层协议,它们各自具有不同的特性和优势。以下是TCP的主要特性以及与UDP的区别。TCP和UDP各有优缺点,选择使用哪种协议取决于应用场景的需求。如果需要可靠性和顺序保证,TCP是更合适的选择;而如果应用对速度和效率要求较高,可以接受数据丢失,UDP则更为适用。

2024-10-19 14:56:28 1252

原创 C++文件流基本操作

提供支持,它包括了对文件的打开、关闭、读写、定位等操作。: 如果希望每次写入文件时都追加到文件末尾,而不是覆盖原有内容,可以使用。: C++提供了一系列的文件流操作符,如。C++中的文件流操作主要通过头文件。: 用于从输入流中读取一行。用于插入换行并刷新缓冲区,函数来定位输入和输出。

2024-09-29 08:41:24 529

原创 多线程:死锁

死锁(Deadlock)是多线程或多进程环境中一种特定的状态,指的是两个或多个线程或进程在执行过程中,由于争夺资源而造成的一种相互等待的状态,导致它们无法继续执行下去。当出现死锁时,相关的线程或进程都处于阻塞状态,无法获得所需的资源。

2024-09-24 22:58:38 485

原创 【Linux】多线程:线程池的创建、日志类、RAII互斥锁、单例模式:饿汉方式与懒汉方式

线程池(Thread Pool)是一种基于池化技术的线程使用模式,它创建了一个线程的集合,这些线程可以被多个任务重复使用。线程池的主要目的是减少在创建和销毁线程时所产生的性能开销。一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。

2024-09-24 22:26:21 1300

原创 【Linux】POSIX信号量、基于环形队列实现的生产者消费者模型

POSIX信号量是POSIX标准(Portable Operating System Interface,可移植操作系统接口)定义的一种进程/线程间同步机制。它提供了一种跨平台的方法来实现进程间的同步和互斥。POSIX信号量可以用于控制对共享资源的访问,确保在任何时刻只有一个进程可以访问该资源,或者限制对资源的并发访问数量。

2024-09-18 19:12:27 832

原创 【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系

生产者-消费者模型是一种常见的并发设计模式,用于处理在生产和消费任务之间的协调。这个模型主要用来解决在多线程或多进程环境中,生产者和消费者之间的同步和数据共享问题。生产者:负责生成数据或任务,并将其放入一个共享的缓冲区(也称为队列)中。消费者:从共享缓冲区中取出数据或任务并进行处理。缓冲区的作用是实现生产者和消费者之间的解耦,使得生产者和消费者可以在不同的速度下独立工作。

2024-09-17 17:24:14 1435 1

原创 【Linux】多线程:线程同步、条件变量

调用之前,必须先锁定互斥量。条件变量在内部会自动解锁互斥量并挂起线程,然后在条件满足后再重新锁定互斥量。使用后,需要在while循环中检查条件,以处理可能的虚假唤醒(假设线程被唤醒时条件并未真正满足)。可能会由于虚假唤醒而返回,即使条件尚未满足。因此,条件变量的等待通常放在while循环中,以确保条件的正确性。其他线程可以使用唤醒一个等待中的线程,或使用唤醒所有等待中的线程。在使用完条件变量和互斥量后,应该调用和来释放资源。

2024-09-15 22:46:22 1222

原创 【Linux】多线程:线程互斥、互斥锁

我们知道一个进程中的多个线程共享进程的地址空间,因此进行线程间的通信是极为容易的,这也就意味着进程中的多个线程可以随意访问进程中的“公共资源”。当一个线程竞争到互斥锁时,首先会将自己al寄存器的内容清零,接着会将互斥量与自己的al寄存器的内容进行交换。1、大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个 线程,其他线程无法获得这种变量。2、但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量(如全局区变量),可以通过数据的共享,完成线程之间的交互。

2024-09-09 19:45:58 1360

原创 【Linux】多线程:线程控制

在学习完pthread_create函数之后,我们了解到该函数有一个形参为函数指针,也就是我们常说的“回调函数”,当线程创建完毕之后,该线程会立刻去执行该函数。在分支线程中,执行流程主要是:1、将需要执行的任务的函数指针通过参数传递给pthread_create函数,当线程创建完毕后,该线程就会跳转到该函数的起始地址处执行该函数的代码。当然,线程分离除了由主线程对其他线程进行分离外,还可以由线程本身进行分离,这时需要用到pthread_self函数获取该线程自身的线程ID。1、 从线程函数 return。

2024-09-06 14:42:13 1191

原创 【Linux】多线程:POSIX库、线程管理、线程ID

我们知道,不同的操作系统中,实现线程的方式并不一致,这就造成了在Linux系统中使用系统调用编写的多线程程序在其他操作系统中可能并不适用。这是因为Linux中的线程是用户级线程,由POSIX库对其进行管理,所以我们在程序中所打印出来的线程ID实际是库给我们所分配的线程唯一标识。:在内核态中,线程ID和进程ID的管理是由内核直接处理的。我们能够观察到,这两个线程同属于一个进程之中,并且有一个线程(轻量级进程)的ID与进程的ID相同,这就是我们所说的“主线程”,主线程并不需要我们手动创建,

2024-09-05 18:47:12 1207

原创 【Linux】多线程:线程概念,线程与进程的区别与联系,多线程相较于多进程的优势

举个更通俗的例子:在我们国家中,家庭通常是政府进行资源分配的单位,则家庭可以视为进程,而一个家庭至少包含一个家庭成员,也可包含多个,且家庭成员共享家庭的资源,但家庭成员又有各自的隐私,因此可以将家庭成员视为线程。所以我们在Linux系统中编写程序时,我们所面对的是pthread库为我们提供的管理“线程”的方法,在内核中实际上是被当作轻量级进程(LWP)来处理的,因此我们称Linux中的线程为“用户级线程”。因此,在使用多线程时,由于多线程共享所属进程中的资源,因此减少了资源的频繁切换。

2024-09-04 23:40:15 897 1

原创 【Linux】网络编程套接字Scoket:UDP网络编程

套接字是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户,是网络进程的ID。网络通信归根到底还是进程间的通信(不同计算机上的进程间通信)。在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。在两个进程进行通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底要和网络中的哪一个进程进行通信,因此套接字中还需要包括其他的信息,也就是端口号(PORT)。

2024-08-09 18:24:14 952

原创 【Linux】进程间通信(3):共享内存

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间,进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种互斥与同步的机制,互斥锁和信号量都可以。

2024-07-31 18:24:56 1003

原创 【Linux】进程间通信(2):命名管道

命名管道(FIFO,First In First Out)是一种特殊的文件类型,用于在不同进程之间进行数据交换。它的设计允许一个进程将数据写入管道,而另一个进程从管道中读取数据。这种机制使得不同进程能够通过管道进行通信,而不需要直接共享内存或使用其他复杂的同步机制。

2024-07-29 20:02:08 943

原创 【Linux】模拟实现简易shell命令行:基于进程创建、进程等待、进程替换等知识的练习

程序功能:模拟实现一个自己的shell执行命令行。涉及知识:字符串输入及操作函数、子进程创建、进程等待、进程替换、环境变量及获取、添加环境变量的函数额外需要了解的功能函数:chdir(char* path)函数——改变当前工作路径名词解释:内建命令(Built-in Commands)是指在命令行解释器(如 Bash、Zsh 等)中直接实现的命令。这些命令不需要调用外部程序或二进制文件,而是由解释器本身提供和处理。注意事项:易错点 :int putenv(char *str);

2024-07-28 18:01:07 265

原创 【Linux】基于匿名管道通信实现的简易进程池

进程池是一种技术应用,它由资源进程和管理进程组成。资源进程是预先创建好的空闲进程,用于处理分配给它们的任务。管理进程则负责创建资源进程、分配任务给空闲的资源进程,并在任务完成后回收这些资源进程。

2024-07-28 17:49:40 728

原创 【Linux】进程间通信(1):进程通信概念与匿名管道

进程间通信、管道、匿名管道

2024-07-27 19:51:24 819

原创 自我反思与暑假及大三上学期规划

在这个暑假中,我会继续用在优快云上发布文章的方式来对我学习的知识进行巩固,其中涉及到C++,数据结构与算法,Linux操作系统。在学校开设的课程上,进行QT与51单片机的学习与入门,并在寒假之前彻底完成对QT和GIT的学习,尝试做一个QT方向的项目。但是开学以后,我并没有把重心放在期望自己应该做的事情上,更多的时间花费在了处理学院的相关事务。现在看来,大二学年在专业课的学习上更多的是“碌碌无为”,对于数据结构与算法和C++的学习也是有许多不足,以至于目前为止我仍然觉得自己没有什么能拿得出手的“长处”。

2024-07-02 22:26:14 567 3

原创 最大子矩阵:前缀和 + 线性动态规划

那么它的子矩阵就是矩阵中的某一片矩阵型的区域,那所要求的“最大子矩阵”的自然是找到在所有子矩阵中,矩阵元素和最大的那个矩阵。第二种情况是将当前位置的元素加入到之前的子序列中,即从当前位置开始新的子序列。dp[i - 1] + nums[i - 1] 表示从当前位置向前延伸的子序列的和,即以 nums[i - 1] 结尾的子序列和加上当前位置的元素值。其实通过上面的例子,我们不难发现进行预处理后的前缀和数组,仍然可以表示原数组的元素,更方便的是对于求原数组圈定矩阵元素和,在处理后的数组中仅通过使用。

2024-05-13 02:39:51 1006 1

原创 【Linux】进程管理(2):进程控制

事实上,只有execve才是真正的系统调用,其它五个函数最终都是调用的execve,所以execve在man手册的第2节,而其它五个函数在man手册的第3节,也就是说其他五个函数实际上是对系统调用execve进行了封装,以满足不同用户的不同调用场景的。在这种情况下,操作系统通常会将孤儿进程的父进程设置为 init 进程(进程号为 1),并由 init 进程接管孤儿进程的管理。孤儿进程的退出方式与其他进程相同。函数会返回两次,一次是在父进程的上下文中返回子进程的 PID,另一次是在子进程的上下文中返回 0。

2024-04-02 22:33:43 1216

原创 【Linux】进程管理(1):进程及概念精讲

进程概念引入二、进程的描述与组织:进程控制块(PCB)与进程标识符(PID)三、fork函数:创建子进程四、进程的地址空间:虚拟内存与写时复制五、进程查看六、进程状态七、父子进程、孤儿进程、僵尸进程孤儿进程:僵尸进程八、进程的优先级九、环境变量【选学】 十、Linux操作系统进程的调度1、活动队列详解2、过期队列详解3、O(1)调度算法

2024-03-31 20:26:05 1302 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除