知识卡片

无锁环形缓冲区如何免锁

专业/工作 · 1107.c

内容

环形缓冲区靠读、写两个指针标记消费者和生产者的位置,天然带来一个性质:只有一个读用户和一个写用户时,两个指针各自独立推进,完全不需要加锁。rte_ring进一步把每侧的”头尾”拆成两个指针——head代表已声明占用的位置,tail代表真正完成、外部可见的位置。多个生产者入队时,先用[[原子操作的本质与CAS]]把head原子地往前挪一段(决定谁抢到了哪段空间),各自写完数据后,再依次把tail推进到自己写完的位置——head用CAS抢位置,tail靠顺序确认可见性,这正是多生产者场景下无锁的关键。

参考来源

《深入浅出DPDK》第4章《同步互斥机制》