同步三要素
同步三要素
简介
在我之前写过一篇lockfree的文章,里面提到了CAS和内存屏障以及之间的关系,这里先总结一下。
lockfree主要是通过一定的编程规范来避免线程之间流程阻塞。不阻塞并不难,难的是不阻塞的基础上确保结果的正确性。
图中有两条重要的路线,一条是并发写,写的过程是一个Read-Modify-Write的过程,不是单步的,因此为了确保正确性,需要一个把RMW做成原子操作,于是CAS就出场了,这是一个处理器支持的操作,在汇编级别支持RMW原子性。
另一条线是多核指令顺序一致性,cpu为了性能,会做指令乱序,这种乱序在同一cpu的程序看来是感知不到的(cpu会自己保证这一点),但是会被其他cpu上的程序感知到,带来异常,为了消除这种乱序,我们需要使用经过封装的原子变量类型,或者使用内存屏障。如果要防止乱序的场景是一个线程写一个值,一个线程读一个值,那么我们通过acquire和release两个轻量屏障就可以实现了,别的场景有可能需要使用全能内存屏障,别的场景是什么呢?比如生产者生产的同时还消费,消费者消费的同时还生产,这就比较复杂,可能需要全能屏障来解决。
那么这两条路线的交集是什么呢,交集是多核执行RMW指令序列时,为了顺序一致性,除了要做到顺序一致,还需要保证结果正确。这个时候就需要CAS配合内存屏障了。
总结完之后,这一文,主要是要展开讲一下这里面更本质的东西,cpu乱序的本质是什么,内存屏障的本质是什么,cas的本质是什么,并延伸到锁的本质是什么。涉及到的技术主要是3点,包括:缓存一致性协议,内存屏障,锁。这三点可总结为同步三要素。