进展性

无死锁:某个申请锁的线程最终会获得锁。

无饥饿:每个申请锁的线程最终都会获得锁。

无锁:调用一个方法的线程中至少有一个最终会返回。

无等待:调用一个方法的所有线程最终都会返回。

共享内存

实际上,线性化与顺序一致性用于描述 执行序列(即历史)。

在共享内存中,提到了最特殊的可线性化的寄存器,称为原子寄存器。

安全寄存器:

正则寄存器:

原子寄存器:

第一章

讲述了如何从单读单写安全寄存器构建一个多读单写的原子寄存器

第二章 原子快照

在本章中,介绍了无锁的原子快照和无等待的原子快照

第五讲 共识协议和同步操作原语

wait-free 的共识协议可以保证每个线程都能在有穷步内终止。一致且有效的共识协议可以保证所有线程在终止时都能得到(即决定)一个相同的值(一致性),而且该值一定是其中某个线程的提议(有效性)。

共识协议包含2部分,propose和decide,propose用于提出每个线程的建议值,decide决定使用哪个建议值。

四、共识数概念

一个对象 X 的共识数为 n,如果它可以用来解决 n 线程的共识问题,但不能解决(n + 1)线程的共识问题。

七、同步原语

在处理架构中,原子寄存器的共识数为1,因此需要引入更为强力的,更为高效的同步操作,在这里为同步原语。

对象为RMWRegister,其方法包含CompareAndSet等。

注意到CompareAndSet的共识数无限大。这很显然,使用一个初始值为0的RMW寄存器,每一个线程都使用CompareAndSet(0, 线程ID)去争抢,只有一个可以修改成功,而修改成功的那就是决定的线程。

第六讲 空转锁和争用

锁包含空转锁(阻塞锁),非阻塞锁(不空转,休眠)

普通的空转锁:TAS,TTAS,回退锁(遇忙则等待一段时间再去请求锁)

四、队列锁(将锁拓展至队列)

第七讲 管程和阻塞同步

可以把锁机制和共享对象(如上述队列)打包,让对象管理自己的同步机制,这就是管程的概念。

一、管程

管程包含同步机制、对象和方法,支持对对象(方法)的互斥访问。管程的方法被调用时须获得管程的锁,在调用返回时释放锁。任何时刻至多有一个线程可以持有管程的锁,

管程所是阻塞锁,强调条件(Condition)

二、读写锁

读写锁可能导致写一致饥饿(),所以引入公平读写锁,当有线程申请写锁时,此时读锁只能被释放,而不能被加锁

三、可重入锁

保证同一个线程在递归获取锁时,能够获取()

四、信号量

第八讲 锁的应用:链表

包含细粒度锁,乐观锁,惰性锁,无锁链表

第九讲 并发队列(实际上也可以认为是应用)

2.1 部分有界队列

这里有界是指,当入队失败时不会停止,而是等待

2.2 无锁的无界队列

image-20221214232459704

3.1 无界的无锁栈

第十讲 共享计数

三、计数网

计数网基于平衡器,通过构造平衡器实现计数网,概念很简单

满足步进特性的平衡网称为计数网。

普通计数网为非线性化的,

静态一致性

https://jnxnj.wordpress.com/2009/01/30/%E7%BA%BF%E6%80%A7%E4%B8%80%E8%87%B4%E6%80%A7linear-consistency%EF%BC%8C%E4%B8%B2%E8%A1%8C%E4%B8%80%E8%87%B4%E6%80%A7%E6%88%96%E9%A1%BA%E5%BA%8F%E4%B8%80%E8%87%B4%E6%80%A7sequential-consistency/

很清楚的讲解

没有太理解为什么双跳计数器是静态一致性的

四、衍射树

第十一讲

二、无锁哈希表

没什么好说的,非常失望

三、开放哈希集