环形缓冲区支持队列管理。rte_ring并不是具有无限大小的链表,它具有如下属性:
相比于链表,这个数据结构的优点如下:
缺点:
数据结构中存储的生产者和消费者头部和尾部指针显示了一个简化版本的ring。
两个生产者同时向ring中添加对象的情况,初始状态是将prod_head 和 prod_tail 指向相同的位置:
第一步:
在生产者的两个core上, ring->prod_head 及 ring->cons_tail 都被复制到局部变量。局部变量prod_next指向下一个元素,或者在批量入队的情况下指向下几个元素。
如果ring中没有足够的空间用于入队(通过检查cons_tail),将返回错误。
第二步:
第二步是修改ring结构中 ring->prod_head ,来指向prod_next相同的位置。此操作使用比较和交换(CAS)指令,该指令以原子操作的方式执行以下操作:
在图中,core1执行成功,core2重新启动。
第三步:
第四步:
每个core现在都想更新 ring->prod_tail。只有ring->prod_tail等于prod_head本地变量,core才能更新它。当前只有core 1满足,操作在core 1上完成。
最后一步:
一旦ring->prod_tail被core 1更新完,core 2也满足条件,允许更新。Core 2上也完成了操作。
本文分享自 nginx遇上redis 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!