深入浅出dpdk读书笔记--无锁队列

本文详细介绍了无锁队列中CAS(CompareandSwap)原子指令的应用,特别是在多生产者和多消费者场景中的环形队列操作,包括环形头尾指针的更新过程和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在了解无锁队列之前,需要了解一个知识点: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),

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值