知识卡片
无锁的两个必要条件
内容
实现完全无锁的并发数据结构需满足两条件:一是Single-Writer Principle——允许多线程读但写操作限定单线程;二是插入内存屏障,强制刷新CPU缓存到主内存并保证写数据先于更新指针的顺序。Linux kfifo、Java Disruptor都是一写多读无锁实践。若写也是多线程则需引入CAS。发散:无锁是把同步开销从运行时锁竞争转移到写入路径的架构约束上。
参考来源
- 位置:第4章《操作系统》4.5.1节「内存屏障」(源文件:_epub-src/text/part0014.html)
- 结论依据:原文明确说明实现无锁需满足:读可多线程写必须单线程(Single-Writer Principle);使用内存屏障强制把值刷新到内存并保证先操作数据后修改指针的顺序不被重排序打乱,Java的Disruptor框架就是基于此实现一写多读完全无锁,多线程写则需要CAS,直接支持卡片对无锁两个必要条件的论述。
- 原始内容:"读可以多线程,写必须单线程,也称为Single-Writer Principle。如果是多线程写,则做不到无锁……内存屏障就是要强制把这个值刷新到内存里面……要保证先操作数据……后修改fifo->in或者fifo->out的值……如果是多线程写,则内存屏障也不够用了,这时要用到CAS。"