RCU 是一种适用于读多写少的算法,但是和 _顺序锁 不同的是,RCU 读端开销很低乃至为零,而 Writer 通过等待的形式来进行旧数据的销毁。
一般而言,在进行无锁编程的时候。Writer 更新时会首先读取旧数据,更新后通过原子操作将旧值进行替换。这时旧值的销毁就变成了一个问题。一般可以通过引用技术来销毁旧值,但是这样意味着 Reader 读取之前需要递增计数器,读取之后需要递减计数器。而计数器常常使用原子操作实现。
然而原子操作并不是没有开销的。普通的指令开销约为 1-3 个时钟周期,原子操作的时钟周期则多达 10 - 100 个,原子操作还会插入内存屏障。多核同时访问一个原子变量还会导致 CPU 缓存失效,从而引发缓存一致性协议。在基于原子操作的无锁编程中,性能曲线为对数函数,在 16 线程时达到一个关键点,更多的 CPU 会导致频繁的竞争和缓存失效。
而 RCU 读端由于开销很小,因此在多核上表现远超过无锁编程。