自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 sockaddr_in

本文介绍了用于IPv4网络编程的sockaddr_in结构体,它包含地址族(AF_INET)、端口号(网络字节序)、IPv4地址和填充字段。通过示例代码展示了如何创建TCP套接字并初始化sockaddr_in结构体,包括设置端口号(8080)和使用INADDR_ANY绑定任意本地地址。最后演示了bind()绑定套接字和listen()监听连接的基本流程,为后续网络通信操作奠定基础。

2025-05-26 19:29:18 212

原创 回调函数的使用

回调函数是一种编程技术,用于在特定事件或操作完成后执行指定代码。它通过函数指针或参数传递实现,常用于异步处理和事件监听。示例展示了如何定义回调类型、实现回调函数并在操作完成后调用它,强调类型匹配和空指针检查的重要性。回调函数提升了代码的模块化和灵活性,适用于扩展功能而无需修改函数签名。

2025-05-26 19:07:33 218

原创 高并发内存池------内存释放

本文主要介绍了内存管理中对象释放和Span合并的相关操作。首先,ReleaseListToSpans函数用于将对象释放到Span中,并在Span使用计数为0时将其释放回PageCache。该函数通过锁机制确保线程安全,并涉及锁的嵌套使用,需注意避免死锁。其次,ListTooLong函数在链表过长时将内存回收到中心缓存。最后,ReleaseSpanToPageCache函数将空闲Span释放到PageCache,并尝试合并相邻Span以减少内存碎片。代码分析中强调了锁的优化、错误处理和代码可读性的改进建议,以

2025-05-17 17:04:09 1108

原创 文件操作与总结

在 C 语言中,文件操作是通过标准库函数(如fopenfclosefprintf等)来完成的。fopen函数用于打开文件,它的第二个参数是一个字符串,指定了文件的打开模式。常见的模式包括"w""a""r"等,每种模式有不同的用途和行为。

2025-05-08 13:05:29 523

原创 高并发内存池------PageCache

1. 当central cache向page cache申请内存时,page cache先检查对应位置有没有span,如果没有则 向更⼤⻚寻找⼀个span,如果找到则分裂成两个。⽐如:申请的是4⻚page,4⻚page后⾯没有挂 span,则向后⾯寻找更⼤的span,假设在10⻚page位置找到⼀个span,则将10⻚page span分裂 为⼀个4⻚page span和⼀个6⻚page span。

2025-05-08 13:00:37 1139

原创 单例模式的实现方法

单例模式(Singleton Pattern)是一种常用的软件设计模式,用于。

2025-05-06 12:00:00 506

原创 高并发内存池------CentralCache

central cache也是⼀个哈希桶结构,他的哈希桶的映射关系跟threadcache是⼀样的。不同的是他的每个哈希桶位置,挂的是SpanList链表结构,不过每个映射桶下⾯的span中的⼤内存块被按映射关系切成 了⼀个个⼩内存块对象挂在span的⾃由链表中。

2025-05-06 09:00:00 809

原创 高并发内存池------threadcache

(1)性能问题。(2)多线程环境下,锁竞争问题。(3)内存碎⽚问题。

2025-05-05 16:30:15 760

原创 线程局部存储----TLS

线程局部存储的主要优点、实现方式

2025-05-05 12:04:29 367

原创 多态与虚函数

多态性允许你编写通用的代码,该代码可以操作不同类型的对象,而这些对象可以有不同的内部结构和行为。当你声明一个函数为虚函数时,你是在告诉编译器,这个函数将在派生类(derived class)中可能会被重写(override)。纯虚函数是一种特殊的虚函数,它在基类中没有实现,要求所有派生类必须提供自己的实现。纯虚函数用于定义接口,强制派生类实现特定的函数。虚函数是 C++ 中实现多态的关键,它提供了一种机制,允许你编写灵活、可扩展的代码。是一个纯虚函数,它在。

2025-04-29 13:38:56 254

原创 日志的实现

日志记录可以帮助开发者了解线程池的运行状态,包括线程的创建、执行和销毁等。当线程池中出现错误或异常时,日志可以提供详细的错误信息,帮助开发者快速定位和解决问题。通过记录线程池的运行数据,如线程执行时间、资源消耗等,可以监控线程池的性能。日志可以帮助识别性能瓶颈,如线程创建和销毁的频率、任务执行时间等。日志可以记录线程池中线程对资源的请求和释放情况,如内存申请和释放。这有助于确保资源被正确管理,避免资源泄漏。在需要审计或需要符合特定合规性要求的场景中,日志可以记录所有关键操作,以满足审计和合规性要求。

2025-04-21 12:12:39 399

原创 高并发内存池-----项目简介、设计⼀个定长的内存池

所谓“池化技术”,就是程序先向系统申请过量的资源,然后⾃⼰管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较⼤的开销,不如提前申请好了,这样使⽤时就会变得⾮常快捷,⼤⼤提⾼程序运⾏效率。在计算机中,有很多使⽤“池”这种技术的地⽅,除了内存池,还有连接池、线程池、对象池等。以服务器上的线程池为例,它的主要思想是:先启动若⼲数量的线程,让它们处于睡眠状态,当接收到客⼾端的请求时,唤醒池中某个睡眠的线程,让它来处理客⼾端的请求,当处理完这个请求,线程⼜进⼊睡眠状态。

2025-04-21 08:42:43 614

原创 信号量的封装

构造函数初始化队列的最大容量_cap,两个信号量_blank_sem和_data_sem管理空位和数据的可用性,以及_cmutex和_pmutex两个互斥锁管理生产者和消费者对队列的访问。

2025-04-17 13:02:25 736

原创 锁------mutex

互斥锁(mutex)是一种用于多线程编程中,以防止多个线程同时访问共享资源的同步机制。其主要作用是保证在同一时间内,只有一个线程能够访问到共享资源或执行特定的代码段。

2025-04-06 10:30:00 1186

原创 线程的创建

由于不可以调用系统,所以要使用第三方库(第三方库要使用-l) -lpthrerad。3. 一个问题:给线程传递的参数和返回值,可以是任意类型(包括对象)。cpu调度的时候看的是lwp,因为Linux中只有轻量级进程。1. main函数结束,代表主线程结束,一般也代表进程结束。2. 新线程对应的入口函数,运行结束,代表当前线程运行结束。第二个参数:设置线程属性,nullptr表示默认。第一个参数:指向线程标识符的指针。第四个参数:传递给线程函数的参数。:分离线程,系统自动回收资源。第三个参数:线程函数地址。

2025-04-02 18:12:17 384

原创 系统调用与中断

中断(Interrupt)和系统调用(Syscall)是操作系统中两个关键机制,分别用于处理硬件事件和用户程序与内核的交互。它们虽然都涉及从用户模式到内核模式的切换,但设计目的和触发方式不同。处理来自硬件或软件的异步事件,强制CPU暂停当前任务,转而去执行特定的处理程序(如键盘输入、定时器到期、磁盘I/O完成等)。为用户程序提供访问内核功能的接口(如文件操作、进程创建、网络通信),是。从用户模式切换到内核模式的唯一安全途径。

2025-04-01 23:57:30 902

原创 搜索二维矩阵

就是我们在虚拟一维数组中二分查找时当前中间位置的值。我们假设将整个二维矩阵按行展开成一个一维数组。可以正确反映矩阵的有序性(如果矩阵是完全有序的)矩阵有 3 行 4 列(m=3, n=4)这种转换方法的前提是矩阵是按行存储的。每个一维索引唯一对应一个二维位置。一维数组索引范围:0 到 11。给你一个满足下述两条属性的。比目标大就左移(排除当前列)比目标小就下移(排除当前行)是虚拟一维数组的中间索引。用于计算行索引(整数除法)用于计算列索引(取模运算)保持了矩阵元素的行优先顺序。不会错过任何可能的位置。

2025-04-01 23:55:34 867

原创 用BFS解决-----拓扑问题

拓扑排序、课程表、课程表II、火星词典

2025-03-31 12:15:00 733

原创 BFS解决----多源最短路径问题

给定一个图,其中包含多个起点和一个终点,多源最短路径问题要求找到从任一起点到终点的最短路径长度。

2025-03-28 12:15:00 1895

原创 系统调用 与 中断

中断(Interrupt)和系统调用(Syscall)是操作系统中两个关键机制,分别用于处理硬件事件和用户程序与内核的交互。处理来自硬件或软件的异步事件,强制CPU暂停当前任务,转而去执行特定的处理程序(如键盘输入、定时器到期、磁盘I/O完成等)。:由外部设备(如网卡、键盘)通过中断控制器(如APIC)发送信号给CPU。键盘按下 → 触发中断 → CPU执行键盘驱动的中断服务程序(ISR)。为用户程序提供访问内核功能的接口(如文件操作、进程创建、网络通信),是。从用户模式切换到内核模式的唯一安全途径。

2025-03-27 21:29:28 734

原创 BFS解决最短路径问题(使用BFS解决最短路径问题的黄金法则)

BFS适用最短路径问题的条件、BFS vs 其他最短路径算法对比、BFS的核心优势

2025-03-27 21:20:31 861

原创 如何进行文件操作

在 C 语言中,文件操作是通过标准库函数(如fopenfclosefprintf等)来完成的。fopen函数用于打开文件,它的第二个参数是一个字符串,指定了文件的打开模式。常见的模式包括"w""a""r"等,每种模式有不同的用途和行为。

2025-03-24 23:30:37 915

原创 BFS解决FloodFill算法

• 并且将这个陆地相连的所有陆地,也就是这块「岛屿」,全部「变成海洋」。这样的话,我们下次 遍历到这块岛屿的时候,它「已经是海洋」了,不会影响最终结果。可以先利⽤ bfs 将与边缘相连的 '0' 区域做上标记,然后重新遍历矩阵,将没有标记过的 '0' 修改成 'X' 即可。遍历当前点的四个方向,如果相邻点在图像范围内且颜色与起始点相同,将其加入队列。在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。遍历网格的每个单元格,对于值为 '1' 的单元格,如果未访问过,则调用。

2025-03-24 23:25:18 771

原创 TopK问题

1.创建一个大小为k的堆(大根堆 or 小根堆)求最小 大根堆 ,求最大 小根堆2.循环:(1)依次进堆(2)判断堆的大小是否超过K3.思考:用大根堆还是小根堆??为什么选择大根堆或者小根堆??方法时间复杂度适用场景排序法数据集较小堆数据集较大,K 远小于 N快速选择O(N)O(N)(平均)数据集较大,对时间要求高。

2025-03-22 16:05:10 653

原创 二叉树最大宽度

被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7)。遍历当前层的所有节点,对于每个节点,如果其左子节点或右子节点存在,将其加入。最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9)。最大宽度出现在树的第 2 层,宽度为 2 (3,2)。整体思路:用数组存储二叉树的方式,给节点编号。:计算当前层的最大宽度,并更新。:用于存储下一层的节点和层级。给你一棵二叉树的根节点。

2025-03-20 23:26:01 434

原创 BFS--------N叉树的层序遍历

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。1.这道题就是对N叉树进行层序遍历(BFS),只需要逐层对树进行遍历即可。3.使用队列的FIFO性质,创建一个队列queue<Node*> q。被用作实现 BFS 的数据结构,按照从上到下的顺序访问树的所有节点。:如果子节点不为空,将其加入队列,以便后续访问。获取当前队列中的节点数,即当前层的节点数。给定一个 N 叉树,返回其节点值的。:遍历该节点的所有子节点。:遍历当前层的所有节点。:获取队列头部的节点。:从队列中移除该节点。

2025-03-20 19:39:33 454

原创 map和set的区别

适用于存储唯一元素并快速检查元素是否存在。适用于存储键值对并快速通过键查找对应的值。根据具体需求选择合适的容器可以提高代码的效率和可读性。

2025-03-07 16:30:00 622

原创 哈希表算法

法二:分析⼀下题⽬,出现「⾄少两次」的意思就是数组中存在着重复的元素,因此我们可以⽆需统计元素出现的数⽬。• 如果不符合条件,那么前⼀个下标⼀定不可能与后续相同元素的下标匹配(因为下标在逐渐变 ⼤),那么我们可以⼤胆舍去前⼀个存储的下标,转⽽将其换成新的下标,继续匹配。在遍历数组的时候,⼀边检查哈希表中是否 已经出现过当前元素,⼀边将元素加⼊到哈希表中。2.因此,我们可以使⽤「哈希表」,令数组内的元素做key 值,该元素所对应的下标做val 值,将 「数组元素」和「下标」绑定在⼀起,存⼊到「哈希表」中。

2025-03-07 11:00:00 1043

原创 Linux--输入输出重定向、父进程与子进程的继承关系

Linux--输入输出重定向、父进程与子进程的继承关系

2025-02-28 11:38:40 511

原创 前缀和算法

了解前缀和算法以及相关模板例题

2025-02-28 11:33:24 997

原创 二分查找算法

在排序数组中查找元素的第一个和最后一个位置。

2025-02-23 21:45:22 715

原创 vector的使用

提供了丰富的接口,支持动态数组的常见操作,包括构造、赋值、访问、修改、容量管理和迭代等。它是 C++ 中最常用的容器之一,适合需要动态调整大小的数组场景。是 C++ 标准库中最常用的动态数组容器,提供了丰富的接口来操作和管理数组。

2025-02-23 21:44:46 954

原创 Flag数组计数

是一种通过使用辅助数组(通常称为。

2025-02-17 22:13:21 392 2

原创 滑动窗口算法

1.滑动窗口就是用“同向双指针”来实现的,俩个指针同时移动来模拟滑动的一个窗口。:例如,在给定大小的窗口内找到数组的最大值或最小值。:例如,寻找具有固定长度k的所有子数组的最大平均值。:例如,寻找满足某些条件的最小子数组长度。:例如,在字符串中查找某个模式的所有出现,像字母异位词、无重复字符的最长子串等问题。:例如,寻找和为指定值的连续子数组的数量。使用滑动窗口技术可以避免暴力搜索方法中不必要的重复计算,因此可以在许多情况下提高算法效率。

2025-02-17 21:46:21 780

原创 四数之和------双指针算法

四数之和与前面的三数之和题目相似,解题方法也一样,分别用俩个for循环来固定俩个数字,将剩下的数字用双指针的方法进行遍历寻找,需要找到的目标值为 sum = target - nums[i] nums[j]2.在提交运行的时候会发现报错,是应为数据的值超过了int存储的边界,所以我们要使用long long来储存更大的数字。请你找出并返回满足下述全部条件且。注意: 1.本到题还需要进行去重处理。

2025-01-14 10:20:22 425

原创 查找总价格为目标值的两个商品、三数之和--------双指针的方法解决问题

如果此时不符合要求,说明在这个数组里面, 没有别的数符合 nums[left] 的要求了(最⼤的数都满⾜不了你,你已经没救了)。让 right-- ,继续⽐较下⼀ 组数据,而left 指针不变(因为他还是可以去匹配⽐ nums[right] 更⼩的数的)。1.面对这样一道判断三数之和的题,在数组中,我们应该首先想到固定一个值然后使用双指针的方法进行遍历解决,然后再优化代码。2.这道题我们先将数组nums排序,然后固定一个值a,再利用双指针的方法,对固定的值的后面的数字快速找到和为-a。时,这行代码将执行。

2025-01-14 09:30:28 808

原创 盛最多水的容器、有效三角形的个数(medium)----双指针方法解决问题

如果改变右边边界,无论右边边界移动到哪都,新的水面高度都不会超过左边界,(也就是不会超过现在容器的大小),但是由于容器的宽度变小,所以容器的容积一定变小。根据这个条件我们把第三条边可以定为最长的那一条,如果其中俩个边的和能大于最长的这一条边,那么这三条边,都满足任意俩边之和大于第三边。:通过使用两个指针分别指向数组的两端,可以有效地遍历所有可能的容器组合,而不需要进行两两比较。:总是移动较小的那一边的指针,因为只有这样才能有可能找到更高的柱子,从而增加容器的潜在最大面积。轴共同构成的容器可以容纳最多的水。

2024-12-13 13:16:21 819 1

原创 判断链表是否有环-----快慢指针的方法

注意:在写代码的过程中要注意不要越界访问,以及特殊示例,即链表为空,或链表只有一个节点。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。2.根据快慢指针的特性,如果俩个指针相等,那么他们就形成了一个环。1.快慢指针的特性:在一个圆圈中,快指针总会追赶到慢指针。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,判断链表中是否有环。给你一个链表的头节点。

2024-12-09 16:33:55 377 1

原创 快乐树-----快慢指针的方法解决问题

2.由此可以得出最终的结果必定在一个圈内,所以我们使用快慢指针的方法进行操作(快慢指针的特性:在一个圆圈中,快指针总会追上慢指针的,也就是说他们一定会在某一个位置相遇)。如果相遇的位置是1,那么这个数就是快乐数,如果始终没有出现1,那这个数就不是快乐数。1.我们从题目中可以得出这样一个结论,当我们不断地将一个正整数替换成他每个位置上的数字的平方和(示例一),这个过程最终只会有一种结果,那就是死循环。(1)一直在1中死循环,即:1->1->1......->1。(2)在历史的数据中死循环,但始终到不了1。

2024-12-09 16:14:14 515

原创 合并俩个有序链表

4.判断俩个链表的指针有没有走到尽头的,如果有一个指针为空,只需要把另一个链表的剩余节点插入到pre之后pre->next = phead1?3.用俩个指针,判断俩个链表的大小,更小的一个节点插入到虚拟节点的pre后,插入后让pre指针向后移动,更小的那个指针也向后移动。输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序。输入:{-1,2,4},{1,3,4}输入:{1,3,5},{2,4,6}返回值:{-1,1,2,3,4,4}返回值:{1,2,3,4,5,6}

2024-12-06 16:31:11 311 1

空空如也

空空如也

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

TA关注的人

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