- 博客(37)
- 收藏
- 关注
原创 Git分支管理
Git分支是Git最强大的功能之一,它允许开发者在不同的开发线上并行工作而互不干扰。通过合理使用Git分支,可以大大提高团队协作效率和代码质量。
2025-07-10 22:13:05
843
原创 I/O多路复用(select/poll/epoll)
通过一个进程来维护多个Socket,也就是I/O多路复用,是一种常见的并发编程技术,它允许单个线程或进程同时监视多个输入/输出(I/O)流(例如网络连接、文件描述符)。
2025-05-12 21:07:00
973
原创 事务、提交方式、回滚
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。一个 MySQL 数据库,不止一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器发起事务处理请求。而每个事务至少一条 SQL 语句,最多很多 SQL 语句,如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。
2025-04-06 11:28:09
670
原创 MySQL索引
索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index,查询速度就可能提高成百上千倍。
2025-04-05 09:51:14
719
原创 线程的互斥与同步
1、假设线程1先对n进行++,在属于它的时间片中,线程1疯狂进行++操作,最终将n加到1000,并且继续++时,第一步和第二步已经完成,在寄存器中保存的是1001,准备执行第三步的时候,属于它的时间片到了,那么这时线程1就会被切出去等待,让其他线程执行。3、此时又将线程1切回来,并且回来的时候,属于它的上下文数据也会带回来,继续完成之前没有完成的任务,那么线程1就会继续执行它的第三步操作,将寄存器中的1001写回内存,这时本来线程2已经将n加到了3000,而线程1又将其变成了1001。
2025-03-25 11:50:16
792
原创 线程控制学习
而且通过上面的两个图也可以发现,他们的地址变换很大,因为刚开始,只是一个全局表量,保存在已初始化数据段,而添加_thread修饰后,主线程的g_val就在主线程栈中存储,而新线程的g_val就在对应线程空间的线程栈上。当我们调用pthread_create创建线程后,在线程库中就会新建一个描述线程的结构体,来保存线程的相关数据,而这一部分也是实际的内存,有对应的地址,而pthread_t本质就是一个进程地址空间上的地址。这里的返回值是new出来的,在主线程的线程等待时记得delete。
2025-03-23 21:45:40
565
原创 页表。线程的初步学习
所以线程就是进程内的一个执行流,线程在进程内部执行就是线程在进程的虚拟地址空间上执行,拥有该进程的一部分资源。解释:CPU内部调度时,每个线程都有运行的时间片,当运行的时间片到了之后就会切换其他线程来运行,这样可以保持多个线程同时调度,也就是并发,但是在这种情形下,可能会有一些线程在属于它的时间片中并没有将自己的代码执行完,就要被切出去,这时就需要保存它的上下文,以便下次调度时继续上次的执行,这样每个线程执行的情况就不同,保存的上下文也就不同,也就是属于每个线程所私有的。
2025-03-22 09:48:51
727
原创 解决shared_ptr的循环引用
在实现智能指针shared_ptr中有一个问题就是循环引用的问题,针对循环引用可以使用weak_ptr来解决。
2024-10-26 09:56:50
344
原创 C++11智能指针
由于异常引发的异常安全(上文有异常安全的介绍)可能会导致内存泄漏,所以我们需要来解决内存泄漏的问题,这里有两种方案::1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测工具。
2024-10-25 10:40:37
972
原创 哈希桶的实现,怎么解决哈希冲突
其实现也是通过取模的方式,只是当冲突出现时,哈希桶的处理方式是将冲突的数据通过链表链接在一起,都挂在同一个映射位置,比如上面的4和44,都映射到4的位置,通过链表链接,查找时在对应的映射位置中遍历查找即可。会发现11,21,31的与capacity模后余数都是1,也需要映射到1对应的位置,这就引发了冲突,即哈希冲突(不同映射值映射到了相同的位置)。闭散列的哈希表也需要增容,因为刚开始存数据的数组大小不能满足,则增容,但是这里的增容不能满了才增容,因为快满时插入数据,冲突的概率很大,效率就低了。
2024-10-20 09:45:00
1127
原创 红黑树的基本实现
红黑树,也是一种二叉搜索树,只是在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。应用更广泛。
2024-10-18 09:54:03
1296
原创 TopK的实现
2:为了找10个最小的,即提取出10个数来建堆,建大堆(建大堆即这10个元素中最大的元素在堆顶,然后将剩下的元素依次提取,与堆顶比较,若是比堆顶小,则将堆顶替换为该数据,再进行调整,变为大堆,调整后堆顶数据还是新的10个数据中最大的,然后继续提取,比较,调整)。前提:从1000个数据中找出10个最小的,这里的实现用到了文件操作,现实中若是基数很大,不能直接在内存中保存,则要借助文件将数据保存,然后再提取数据进行比较。在此前,已经介绍了向下调整算法,建堆以及堆排序的实现,这篇文章将实现TopK问题。
2024-07-30 14:47:20
331
原创 堆排序的实现
以数组形式来看就是{64,45,37,23,23,9,7,5,3,1};首先需要知道的是,如果想要对一个数组排升序,要建大堆,排降序,要建小堆。3)交换完后,最后一个数据不动,剩下的数据对堆顶元素进行向下调整;2)交换堆顶(第一个)和堆尾(最后一个)的数据;这里的黄色框内表示没有参与调整。以此循环进行,最终实现排序。具体过程:(以排降序为例)2)交换堆顶和堆尾的数据,4)循环2)3)步骤。
2024-07-19 20:25:01
354
原创 快速排序法排序方法三
cur才进行交换,这句代码的意思是如果刚开始进来访问的位置处的值就比key小,并且++prev后prev和cur指向同一个位置(例如cur=0,prev=cur-1,当访问0位置处的值比key小,则++prev后等于cur,两个同时指向0位置处),则交换不交换都可,所以不交换也行,当不相等时的交换才有意义。下面注释的代码是进行交换的。4,处理完后,prev处及其左边都是比key小的值,其右边都是不小于key的值,再++prev然后和最后位置的基准值交换,这样就可以确保以基准值为中分为左右两个子序列了。
2024-07-11 09:08:44
850
原创 快速排序法排序方法二
2,从左边开始位置begin开始向右边找比key大的值,找到后将其填入到“坑位”,那么当前begin位置就成了新的“坑位”;3,然后从右边end位置开始向左找比key小的值,找到后将其填入到“坑位”,那么当前end位置就又成了新的“坑位”;4,以此反复,当begin和end相遇时,即为最后的一个“坑位”,再将最初保存的基准值填入这个“坑位”;1,将最后一个位置的值作为基准值(key),并且保存下来,那么最后一个位置可以抽象成一个“坑位”;5,最终会形成左边序列比基准值小,右边序列比基准值大;
2024-07-09 09:08:27
1237
原创 快速排序法排序
值得注意的是,在PartSort1中添加的前两行代码,第一行是调用GetMidIndex函数,得到选定的基准值的位置,然后第二行是将该基准值换到最后,因为整体的代码实现是以最后一个位置作为基准值的位置实现的,所以要将基准值换到数组的最后一个中。在上一篇文章中介绍了快排的左右指针的方法来实现,并且最后还提到一个三数取中的方法来确保取定的key(基准值)不是要排序的数组中最大或最小的,因为取到最大或最小的值为基准值,将会使这个算法变成效率最慢,所以才有三数取中法;
2024-07-07 20:31:37
167
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1