- 博客(72)
- 收藏
- 关注
原创 EfficMultiCoreMemoryPool项目
本文介绍了一种高效的多核内存池实现方案,包括定长内存池、线程缓存(ThreadCache)、中心缓存(CentralCache)和页缓存(PageCache)三级架构。定长内存池通过自由链表管理内存碎片,解决malloc碎片问题;ThreadCache为每个线程独享的无锁缓存;CentralCache通过共享SpanList管理内存块;PageCache按页管理大块内存并支持合并。项目采用基数树优化映射查询,测试表明性能优于malloc,尤其在高并发场景。文章详细阐述了各级缓存的设计原理、内存分配/释放流程
2025-05-29 20:25:47
1031
原创 【Linux】线程POSIX信号量
本文介绍了信号量的概念及其在多线程编程中的应用。信号量主要用于同步操作,确保无冲突地访问共享资源。POSIX信号量可用于线程间同步,本质是一个计数器,用于预定特定资源。文章详细说明了信号量的基本接口,包括初始化、P操作(申请资源)、V操作(释放资源)和销毁信号量。此外,文章还通过生产者消费者模型的实例,展示了如何利用信号量和互斥锁实现线程间的同步与互斥,特别是在多生产者多消费者场景中,如何通过信号量筛选有效线程,避免死锁,并保证操作的原子性。最后,文章提供了一个基于环形队列的生产者消费者模型的代码实现。
2025-05-10 11:19:19
792
原创 【Linux】线程的同步与互斥
本文深入探讨了线程互斥与同步的概念及其在多线程编程中的应用。首先,文章回顾了互斥的基本概念,包括临界资源、临界区、互斥和原子性,并通过抢票系统的代码示例展示了多线程环境下数据不一致的问题。接着,文章引入了互斥锁(Mutex)的概念,详细介绍了其接口、使用方法以及如何通过加锁机制解决数据竞争问题。此外,文章还探讨了条件变量(Cond)的使用,解释了如何通过条件变量实现线程的同步,避免线程饥饿现象。最后,文章介绍了生产者/消费者模型,并通过阻塞队列(BlockingQueue)的实现展示了如何在实际应用中结合互
2025-05-10 11:02:54
1043
原创 【Linux】操作系统的理解/进程/环境变量/虚拟地址空间
Linux系统中,OS必定需要对内存中的可执行程序进行一个管理:先描述,在组织OS对一个程序的描述使用的是一个名为task_struct(Linux下PCB的名称)结构体,我们将其称作为一个进程控制模块PCB(process control block)进程就是:PCB+程序的数据代码对进程的管理也变化为对程序列表的管理,增删查改这个列表即可!进程的所有属性都可以通过task_struct(PCB)找到内容分类• 标示符:描述本进程的唯⼀标示符,⽤来区别其他进程。
2025-02-11 19:09:53
743
1
原创 【MySQL-8】MySQL视图/用户管理
视图就是一个虚拟表,它可以将我们select语句查询的结果创建并且存储在一个新的虚拟表(视图)中,并且这个虚拟表和原表之间的关系相连密切,无论修改哪一方都会影响另一方。order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖视图可以和表一起使用。创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响视图不能添加索引,也不能有关联的触发器或者默认值。: 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
2025-02-11 11:43:55
937
原创 【C++】Unordered_map/Unordered_map使用哈希表封装
本次的封装实现基于上次实现完成的链地址法的哈希表,使用哈希桶对unordered_map/unordered_set进行封装
2024-12-08 20:05:41
705
原创 【MySQL-6】MySQL的复合查询
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(不包含自己部门的员工)查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)指嵌套语句中返回单个子查询结果,如下面问题的deptno。查询的条件有多个,返回多列条件。
2024-11-30 18:43:24
1313
原创 【C++】Set/Map使用红黑树封装
stl库中通过这种巧妙的方法使我们只需要我们实现一棵红黑树就可以复用形成set/map的底层,通过模版的形式让编译器去帮我们生成对应的代码,泛型思维。由以下代码我们可以分析出stl库中的set和map底层都是通过红黑树所实现的。
2024-11-13 16:20:32
658
原创 【C++】二叉搜索树的概念与实现
⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义:map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等 值,multimap/multiset⽀持插⼊相等值。⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树: 左子树的值默认小于根节点,右子树的值默认大于根节点。我们统计一个书中相同单词的个数,Key就是这个单词,而value表示单词的个数。走后序遍历进行析构delete。
2024-10-14 21:19:38
497
2
原创 【C++】适配器stack/queue/priority_queue使用和实现
stack/queue/priority_queue的使用和实现
2024-10-09 16:44:06
1001
2
原创 【C++】c++的继承
基类和派生类又可以称作父类和子类,派生类可以继承基类中的成员,并且还可以拥有自己的成员,就好比植物是一个大类,而蒲公英也是一种植物拥有植物的特性(也就是植物类的成员属性),同时蒲公英也拥有自己的其他特点,如传播种子的方式;所以基类和派生类的关系如下图: 我们之前学习过每个类域都有着不同的成员,如public,protected,private。对于公共的成员public不管是类域内还是外都可以访问,对于后面两者只有在类域才可以访问,同样的是基类和派生类之间的基础方式也存在这种关系! 基类成员不希望外部访问,
2024-09-14 12:11:48
1288
2
原创 【c++】C++类和对象详解(下)
const成员函数,取地址运算符,再探构造函数,隐式类型转换,static成员,友元,内部类,匿名对象,对象拷贝时的编译器优化
2024-07-23 12:45:41
1186
8
原创 LeetCode 链表OJ题
题目信息及链接:面试题 17.04. 消失的数字 - 力扣(LeetCode) 分析:首先我们看到题目给予了我们一个数组,要求我们找到消失的数字,这个消失的数字指的是所给我们的数组中排序后少掉的数字,比方说示例1中给了最大数3,前面的数字应该是0,1,2,3,但是输入的却是3,0,1,缺少了数字2,那么2就是消失的数字。并且题目要求O(n),意味着我们只可以遍历一遍数组。思路考虑: 既然它给我们的是缺失的数组,那么我们可以创建一个正常的数组,通过对双方数组元素的对比找出缺少的数字,但是这样的时间复杂度就是O
2024-07-17 08:25:08
982
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人