自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 OSTEP:wakeup/waiting race

在原文中有一段说明了这段代码这一种情况会出现race现象,那就当一个线程在调用park之前被操作系统切换到另一个持有锁的线程,然后该线程很快的又释放了锁,这就导致第一个线程在调用park时,它的id已经在queue中被删除,然后调用park就会进入永远的sleep,这不符合我们对于一个锁的预期,所以有了以下改进。通过 setpark(),一个线程表明自己马上要 park。如果刚好另一个线程被调度,并且调用了 unpark,那么后续的 park调用就会直接返回,而不是一直睡眠。

2023-07-30 13:51:25 83 1

原创 ticket锁,一种公平的自旋锁

线程的“turn”(顺位,即 myturn)。根据全局共享的 lock->turn 变量,当某一个线程的(myturn。== turn)时,则轮到这个线程进入临界区。unlock 则是增加 turn,从而下一个等待线程可以。如果线程希望获取锁,首先对一个 ticket 值执行一个原子的获取并相加指令。本方法能够保证所有线程都能抢到锁。只要一个线程获得了 ticket值,它最终会被调度。ticket锁利用了一种硬件原语:Fetch-And-Add(获取并增加)指令。只是简单的返回旧值,然后加1.

2023-07-30 10:51:36 140 1

原创 并发控制:互斥(Peterson算法、自旋锁、互斥锁和futex)

futex是一种用户空间的快速互斥量机制,由于自旋锁获得锁很快,而互斥锁没有得到锁时也不太占用cpu,那么就将二者结合,futex在获得锁时和自旋锁一样,在用户空间操作,通过一条原子执行xchg就可以得到锁而不需要调用syscall,而获得锁失败时,会将线程进入休眠状态从而等他一个条件(锁释放)唤醒,而futex可以用来实现互斥锁,条件变量等高级同步原语。在多线程程序中,由于共享资源的存在和指令并发是原子执行的,这就导致race(竞态)现象,以下代码就是一个产生竞态现象的多线程代码。

2023-07-28 21:38:31 643 2

原创 关于在创建二叉树时,为什么常常传入的参数是根节点的二级指针,如果传入的是一级指针会怎么样

原因1:前面我们说过指针本身也是一个对象,所以如果你传入的是一级指针,那么它就无法在函数内部去改变它的地址,而在你为这个指针分配内存的时候,其实就是在改变这个指针的地址,但是我们知道,但是我们知道要让函数的形参影响到实参,那么我们传入的应该是该参数的地址或者通过引用的方式来达到我们的目的,同样的,因为指针本身也是一个对象,所以传入的也应该是指针的地址,也就是二级指针。在这之前,我们要知道的是,指针本身也是一个对象,它与其他的内置类型一样,只不过它的值是一个地址。现在我们解释这是为什么。

2022-11-20 22:42:24 390 1

原创 单源最短路——Dijkstra算法与链式前向星存图

链式前向星是一种,用边集数组和邻接表相结合,可以快速访问一个顶点的所有邻接点,在算法竞赛中广泛使用。——摘自知乎对于下面这组数据,第一行4个顶点,6条边,接下来的6行是边的起点、终点、权值,比如 1 -> 2 的权值为2链式前向星存的就是每一个顶点为起点的边的集合我们给上面的6条边进行编号【0,5】。

2022-09-19 23:49:17 464

原创 多态以及多态的底层剖析

下面通过案例来讲解多态的基本使用。

2022-09-18 22:59:13 312 1

原创 虚继承——解决菱形继承的问题以及其底层实现

在c++中我们有一种继承方式叫做菱形继承,通俗来说就是有两个类(son1,son2)都继承了同一个类(base),然后又有一个类(grandson)来继承这两个类(就是多继承的一种,个人不建议在实际开发中使用多继承)。但是这样做会带来两个问题或许这样看不是很清楚,我们上代码看看那么c++给我们提供了虚继承用来解决这种问题,只需要在son1和son2继承base时使用虚继承即可(grandson正常继承son1和son2),语法:class son1 : virtual public base {};

2022-09-17 17:21:48 332

原创 进制哈希个人笔记

这里我个人将base=131( 主要是看其他人也是这样设置的 0.0,不要是模数 因子,不然就白模了 ),然后mod=212370440130137957(其实这里取一个很大的数就可以,尽量选择质数,也尽量不要选择超过10的9次方级别)。注意:在转换时,因为累乘的存在,所以有可能会有爆int的情况,这时需要对一个数取余,来达到缩小数的大小的期望,以此来尽量避免爆int的情况(或者是爆其他的类型**~_ ~**)不过既然是哈希就避免不了哈希冲突。这里附上一些简单的代码。

2022-09-16 17:51:40 182

原创 欧拉筛个人笔记

到了 4,4 没加入 prime 数组,枚举质数(有2,3),筛掉 8 后,因为 4 mod 2=0,触发退出条件。就像2这个素数,把不包括2在内的2的倍数全部剔,然后再向后枚举,查到一个未被剔除的数,再进行上述操作,比如2下一个数就是3,然后再把3的倍数剔除。但是这样的做法会造成重复剔除,比如2剔除了12,然后3又剔除一次12,接着6又来一次,就降低了效率。(运行过程)从 2 开始,2 加入 prime 数组,再从小到大枚举质数(现在只有 2),筛掉质数与 2 的乘积(4 被筛掉)。

2022-09-16 17:49:40 110

原创 快速幂个人笔记

第一次循环,b=1011,最后一位为1?,是的话说明 a^11 = a^8 * a^ 2 * a^1,中的 a^1 存在,所以ans*=base。* 第四次循环,b=1,最后一位是1,那么说明 a^8 存在,继续ans*=base,到此循环结束,ans就是最终的结果。比如b=11,转化为二进制就是1011,从左到右,这些1分别代表十进制的8、2、1,那么可以说a^11=a^8 * a^2 * a^1。* 第二次循环,b=101,最后一位还是1,那么这个时候说明 a^ 2 存在,继续ans*=base。

2022-09-16 17:44:36 185

空空如也

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

TA关注的人

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