在了解无锁队列之前,需要了解一个知识点:CAS(Compare and Swap,比较并替换)原子指令,用来保障数据的一致性。指令有三个参数,当前内存值V、旧的预期值A、更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。函数原型如下:
rte_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src)
当dst指向内存的值和exp的值相等时,将src的值更新给dst。对于无锁队列来说,比较复杂的是多生产者和多消费者的这种情况,现在就以多生产者为例,多消费者的情况和多生产者相似,先以图形讲解
1、图解无锁队列
(1)ring的pro_head、pro_tail赋值给本地pro_head,pro_next指向表的下一个元素。
(2)这个操作是一个核心,多个生产者进入到这一步,会有CAS的一个操作,ring.prod_head和本地pro_head进行比较, CAS 操作失败,代码重走第一步。如下图所示,core1比较成功,则将新的位置索引赋值给ring.prod_head,core2由于比较失败,所以core2重新走第一步,prod_next遍历下一个环的位置,prod_head遍历同样遍历到下一个位置。
(3) 在核心 2 上重试 CAS 操作并成功。核心 1 更新环的一个元素 (obj4),