自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程的pthread_create、pthread_join、pthread_exit、pthread_detach函数

存储新线程的标识符(ID)线程属性(如栈大小等)一般为nullptr使用默认属性指向线程要执行的函数(返回值和参数类型都要是void*)传递给线程调用的函数的参数(可以是字符串、整型、类对象等)线程的所有相关函数执行成功时均返回0,失败时均返回错误码多线程编程中,​虽然每个线程有独立的栈空间,但主线程传递给子线程的类对象或结构体对象仍应通过new在堆上动态分配:虽然栈空间独立,但整个进程的虚拟地址空间是共享的,因此线程间可通过指针访问任意内存地址(包括其他线程的栈)主线程如果以。

2025-03-23 23:38:39 641

原创 MySQL的约束

一个表中只能有一个主键但可以有多个唯一键,用于增强约束力,唯一键保证列中的值是 唯一的,但是 可以为 NULL。不同于主键,唯一键允许 NULL 值,并且每个 NULL 值在字段中是允许重复的

2025-03-11 00:13:34 1076

原创 MySQL的数据类型

varchar类型的数据所占字节范围为0~65535,但其中前3个字节用于记录该数据的大小,故字符所能占的最大字节数为65532,若当前表的编码方式是utf8,则L最大为65532 / 3 = 21844。低版本的mysql中bit类型的字段是按照ASCII码对应的值显示的,所以有的可能显示不出来,如果bit后不跟约束,则默认为bit(1)(MySQL中的字符与C/C++中的字符不一样,C/C++中一个汉字占三个字节,但是MySQL中一个汉字就是一个字符)且float类型的字段的占用4字节。

2025-03-10 02:06:53 956

原创 Ubuntu下MySQL的安装与使用(一)

数据库指以特定结构存储在磁盘或内存中的数据集合(一种概念),而数据库服务指由数据库管理系统(DBMS) 提供的一种能进行数据存储、检索和管理的网络服务,

2025-03-08 23:23:45 731 1

原创 Linux中线程的基本概念(重要)

在Linux操作系统中线程是进程内部的一个执行分支,是CPU调度的基本单位,而进程是分配系统资源的基本单位(地址空间)(完整的执行流需要PCB、进程地址空间、页表、代码和数据,这些内容线程都有只不过可能是借用了进程的部分内容)(Windows中的线程设计是符合理论的)(新的数据结构TCB)(上图所示)

2024-11-11 21:37:37 531

原创 Linux中的网络指令:ping、netstat、watch、pidof、xargs

用于将标准输入或文件中的内容转换为命令的参数。它非常适合用于监控系统状态、查看某个命令的运行情况等。获取正在运行的某个程序的进程PID,它会根据给定的程序名查找该程序对应的所有进程,并返回其 PID。显示使用连接的进程及其 PID,用于查找某个端口号被哪个进程占用。列出所有正在监听的服务器套接字以及已建立连接的客户端套接字。每 2 秒钟刷新一次指定命令的输出。指定每次请求之间的间隔,默认是1秒。查看TCP协议的也是同样的道理。转换为命令行参数来执行指定的命令。指定发送的回显请求的数量。

2024-10-07 21:48:34 816

原创 Linux环境下的日志文件的实现(一般)

日志等级] [PID] [FileName] [FileNum] [Time] 日志内容。用于记录软件运行时的信息,可以向显示器和文件中进行打印,且有特定的格式。(常规输出,比如打印某文件成功)(很严重但程序仍然勉强能运行)(有问题但不影响程序执行)(致命的,程序无法运行)日志所存放的文件名称。

2024-10-06 18:32:44 1243

原创 网络基础:TCP/IP五层模型、数据在局域网传输和跨网络传输的基本流程、IP地址与MAC地址的简单解析(重要)

独立模式、网络互联、局域网、广域网一台电脑主机内的CPU、显卡等设备都是由一条总线连接起来的,所以可以将一台计算机的内部也看作是一个小型网络结构​​​​​​​。

2024-10-04 23:01:55 1520

原创 高并发内存池(六):补充内容

内存申请大于256KB但小于128 * 8 * 1024KB:因为PageCache中存放的span所管理的最大页数为128,即span可分配的最大内存为128 * 8 * 1024 KB,所以当可以直接向PageCache申请一个合适的span(该span管理的页数为此次内存申请对齐后大小 / 页大小)内存申请大于128 * 8 *1024 KB:PageCache中已经没有合适的span了,直接向堆上申请。

2024-09-29 18:21:31 831

原创 高并发内存池(五):ThreadCache、CentralCache和PageCache的内存回收机制、阶段性代码展示和释放内存过程的调试

我们无法直接通过从Thread Cache中归还的内存结点的地址确定该内存结点要被归还给CentralCache中的哪个span,需要先将该内存结点的地址转换为页号(内存结点都是从页中分配的),再通过页号和span的映射关系确定要归还的span是哪个

2024-09-27 16:15:49 1016

原创 高并发内存池(四):阶段性代码展示 与 申请内存过程的调试

static 修饰类中的函数时,会使该函数成为该类的静态成员函数,存储在程序的全局静态存储区(或代码段),而不是为每个对象分配的堆或栈空间,可以直接使用类名调用,不需要也不推荐使用实例化后的类对象进行调用,所有该类实例化出的对象共享该静态成员函数,该函数只能访问类的静态成员变量和其它静态成员函数

2024-09-22 20:54:07 1091

原创 高并发内存池(三):CentralCache与PageCache的实现

_usecount用于记录当前span分配出去了多少个块空间,每分配一块给threadcache,就要++use_count,如果threadcache还回来了一块,那就- -use_count,_usecount初始值为0。当span中的use_count为0的时候可以将其还给pc以供pc拼接更大的页,用来解决外碎片问题。

2024-09-19 21:52:43 852

原创 高并发内存池(二):​ThreadCache、通用函数、自由链表的初步实现

是哈希桶结构,每个桶下都挂有一个自由链表,每个线程独享,用于分配单次申请的内存小于256KB的情况(而不是说它一共可分配的内存为256KB),每个线程从这里申请内存不需要加锁,更加高效所有线程共享,故使用桶锁来解决各个线程在申请内存时存在的竞争关系(因为只有某个线程缓存没有足够的内存时才会向中心缓存申请,所以这里的竞争没有那么激烈),每个线程的线程缓存会按需求从中心缓存中获取内存,中心缓存再在合适的时机回收线程缓存中的内存,从而达到内存分配在多线程中更加的均衡,中心缓存没对象时会去页缓存申请页。

2024-09-08 20:30:37 789

原创 高并发内存池(一):项目介绍与定长内存池的实现

32下指针4字节大小和64位环境下指针8字节大小且int均为4字节,如果在32位机器下使用*(int*)obj 令obj指向的内存结点的前4字节存放下个结点的地址是没问题的,但是如果是64位环境,指针占8字节解引用后仍只能获取前4个字节,即获取的地址是实际的一半就会出问题,所以我们采用解引用二级指针的方式,这样就不需要我们额外的判断当前程序运行时所处的环境了

2024-09-05 21:51:55 971

原创 C++中的类型转换操作符:static_cast && reinterpret_cast &&const_cast && dynamic_cast(重要)

(operator +类型名)

2024-07-01 16:11:47 877

原创 C++的特殊类设计 与 单例模式的两种实现方式(重要)

如果有定义的话虽然设置了private,但只是避免了外部直接调用,但类内部的其它成员函数还可以使用拷贝构造和赋值重载。

2024-06-23 22:55:37 934 1

原创 C++的RAII思想、智能指针类、shared_ptr的循环引用问题、定制删除器(重要)

C++11并没有类似boost库中提供的shared_array智能指针类用于管理和释放由[ ]创建的多个智能指针对象,所以在使用shared_ptr管理和释放由[ ]开辟的多个对象时,会因为delete与new的方式不匹配而报错。可以有多个指向相同资源的指针,资源管理依赖于引用计数,因此必须小心循环引用问题,避免资源无法释放。2、weak_ptr也有use_count接口,用于获取此时weak_ptr指向的资源的引用计数。的资源并增加引用计数,一些列操作导致int资源的引用计数不变,相当于什么都没干。

2024-06-20 23:36:07 746

原创 QT:QT中的默认代码 && QT 创建控件的两种方式

delete ui;在Widget构造函数中初始化列表中,使用parent 初始化基类在构造函数中调用的 ui->setupUi 就是用来将 Widget 和 form file 绑定的。

2024-06-14 16:02:41 970 1

原创 C++的异常捕获、异常安全、noexcpt关键字(重要)

3、找到匹配的catch子句并处理后,会继续执行catch子句后的非try...catch块中的内容。(异常是一种运行时错误,可以中断程序的正常流程,常见的异常包括除零错误、文件未找到、网络连接失败等)需要程序员自己去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。如果异常未被捕获,它会向调用栈的上传递,直到找到一个处理器,如果找不到一个处理器就会使程序终止。,并将控制权转移到预定的异常处理逻辑中。太过强硬,如果发生内存错误,或者除0语法错误等就会直接终止程序。

2024-06-14 15:52:01 1565

原创 C++11的可变参数模板、emplace_back接口、C++17的折叠表达式(重要)

emplace_back是C++11提供的一个基于可变参数模板实现的新的成员函数

2024-06-12 14:13:02 389

原创 C++11:右值引用的移动语义、万能引用、完美转发与forward函数、default和delete关键字(重要)

左值指拥有明确内存地址的持久对象,可以通过取地址符获取其地址;右值指临时对象,无持久内存地址,不可通过取地址生命周期仅限于当前表达式,C++11时右值被细分为纯右值(就是传统意义上的右值)和将亡值表示一个资源即将被销毁但可以“转移”的对象,可使用move将一个对象标记为“将亡”,并允许其资源被“移动”(≠ 拷贝)到另一个对象,移动后原对象的数据不再保证有效。

2024-06-11 16:57:20 1318

原创 Leetcode:括号生成

因为先添加的肯定是左括号,所以后添加的右括号都等于n了,那么左括号应该也满足了

2024-06-08 12:41:51 407

原创 Leetcode:合并两个有序链表

(其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次)合并(l1,l2)等价于解决 l1->next = mergeTwoLists(l1->next, l2) 以及l2->next = mergeTwoLists(l1, l2->next)的子问题。

2024-06-08 11:57:08 425

原创 Leetcode:有效的括号

最坏情况下字符串s全是左括号没有右括号,此时栈的长度就是字符串s的长度

2024-06-07 14:11:23 283

原创 Leetcode:删除链表的倒数第N个结点

对于链表的删除要考虑头删和尾删的结果。

2024-06-07 09:45:15 334

原创 Leetcode:四数之和

(long) nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] 是表达式的类型提升,有一个long则后面的所有运算均提升为long操作。类似于三数之和的解法,但需要多加一些限制,同时为了防止多个数组元素的相加之和出现整型溢出问题还要将整型转为long。(查找前两个数要两次for,查找后两个数因为有双指针同时向里走的缘故,所以只用一层for)(仍然是花费在了排序的额外空间上)

2024-06-06 20:41:50 350

原创 Leetcode:电话号码的字母组合

回溯的原因是用来暂存结果的容器只能push_back,pop_back,如果不pop_back就会使结果不对。所以直接使用一个定长数组暂存结果,就无需回溯,直接赋值即可。

2024-06-06 20:20:15 311

原创 C++98和C++11的构造和初始化、initializer_list以及decltype关键字(一般)

存放不同类型的pair对象间可以进行拷贝构造,是因为pair的拷贝构造是一个函数模板(但也要保证有关联性可以进行隐式类型转换否则也可能会报错)并且不能同时出现两个非内置类型类型的隐式类型转换,否则也会报错,因为C++不允许非内置类型的“链式”隐式转换(比如转换第一个元素 const char* 到 const std::string后接着还要转换第二个元素 char* 到 std::string),如果真的想要需要手动强转为指定的自定义类型

2024-06-06 19:09:57 2401

原创 Leetcode:最接近的三数之和

最近值即为差值的绝对值最小值

2024-06-05 15:21:13 290 1

原创 Leetcode:三数之和

(假设排序前abc的组合满足要求,且a

2024-06-05 14:29:27 520 1

原创 Leetcode:最长公共前缀

从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。用第一个字符串与后续的每个字符串进行比较,先获取S1和S2的最长公共前缀,然后将该次比较获得的最长公共前缀再与下一个字符串进行比较更新,直至循环结束。(其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次)

2024-06-04 12:32:45 452

原创 Leetcode:罗马数字转整数

通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,累加每个字符对应的数值即可。当前位置表示的元素的值 < 下个位置表示的元素的值,就用总数减去当前位置的值。(XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27)若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。(XIV 可视作 X−I+V=10−1+5=14),否则总数加上当前位置的值。

2024-06-04 09:09:49 216 1

原创 Leetcode:整数转罗马数字

为了表示一个给定的整数 num,我们寻找不超过 num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至 num 为 0。最后得到的字符串即为 num 的罗马数字表示。(由于 valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。(由于 valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。

2024-06-03 16:44:03 654 1

原创 Leetcode:盛最多水的容器

两个指针指向的数字中较小值∗指针之间的距离。循环列举容器的大小,并留下最大的那个容器。这种写法会超出时间限制,无法通过。

2024-06-03 15:08:31 882 1

原创 Leetcode:正则表达式匹配

1、①和②可以总结为一种情况:当p[j]==s[i] 或者 p[j]==. 为真 且dp[i-1][j-1]为真(两个的末尾都匹配了 或者 p的末尾为.时无论s的末尾为什么字符都能匹配),那么dp[i][j]就为真2、③可以总结为:当 dp[i][j-2] 为真或者 (p[j-1] == '.' || p[j-1] == s[i])一个为真且 dp[i-1][j] 为真,则dp[i][j]为真。

2024-06-02 20:13:23 1567 2

原创 Leetcode:回文数

1、x为负数时永远不可能为回文数 2、x为个位数时不可能是回文数

2024-06-02 10:45:12 488

原创 C++哈希的应用:位图 && 布隆过滤器 && 哈希切割(重要但尚未更新)

有四十个亿未排序的不重复的无符号整数,此时提供一个无符号整数如何快速判断某个无符号整数是否在这40个亿数中?遍历,时间复杂度为O(N)(先)排序 + 二分查找,时间复杂度为O(logN)(不如位图的原因是排好序后如果进行插入删除麻烦,尤其是很多数时在0下标插入,需要挪动大量的数据,删除同样也要挪动大量数据,即排完序后是很好找,但麻烦在插入和删除,因此对于需要快速判断元素是否存在,并且需要频繁进行插入和删除操作的情况,使用位图是一个更好的选择)位图。

2024-06-01 18:23:44 850

原创 Leetcode:字符串转换整数 (atoi)

①忽略字符串开头的空格,直到遇到第一个非空格字符为止。③继续读取数字字符,直到遇到非数字字符为止。(042的0也会读取,出去的时候会消去)符号时,它会识别这是一个负 / 正数。

2024-06-01 15:10:41 396

原创 Leetcode:整数反转

如果只用if(rev > INT_MAX / 10 || rev

2024-06-01 12:35:59 426

原创 Leetcode:Z 字形变换

新建二维数组的行数 = r,列数为 =(n / t)* (r - 1) ,即[r,(n / t)* (r - 1)]当我们在矩阵上填写字符时,会先向下填写 r 个字符,然后向右上继续填写 r−2 个字符,最后回到第一行。Z 字形变换的周期 t = r + r − 2 = 2r − 2。,每个周期会占用矩阵上的1 + (r - 2)= r − 1列。总列数 =总周期数 * (r - 1)总周期数 = n(总字符数)/ t。(一个残缺的斜着的v)

2024-05-31 21:54:45 459

高并发内存池未进行性能优化前的代码

高并发内存池未进行性能优化前的代码

2024-09-30

高并发内存池的内存释放流程图

释放内存过程的调试

2024-09-26

高并发内存池的内存申请流程图

高并发内存池的内存申请流程图

2024-09-26

空空如也

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

TA关注的人

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