码迷,mamicode.com
首页 > 其他好文 > 详细

rte_atomic32_cmpse

时间:2020-09-17 20:57:35      阅读:33      评论:0      收藏:0      [点我收藏+]

标签:mic   div   基本概念   mem   一致性   队列   compare   临时   sign   

CAS
学习无锁队列前先看一个基本概念,CAS原子指令操作。

CAS(Compare and Swap,比较并替换)原子指令,用来保障数据的一致性。

指令有三个参数,当前内存值V、旧的预期值A、更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。

在DPDK中封装后的函数如下:

rte_atomic32_cmpset(&r->prod.head, *old_head, *new_head)
&r->prod.head指向当前内存值,*old_head为执行该操作前将r->prod.head存储到临时变量的值,*new_head为即将更新的值。

只有r->prod.head == *old_head才会将r->prod.head更新为*new_head

 

rte_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src)
{
        unsigned int ret = 0;

        asm volatile(
                        "\tlwsync\n"
                        "1:\tlwarx %[ret], 0, %[dst]\n"
                        "cmplw %[exp], %[ret]\n"
                        "bne 2f\n"
                        "stwcx. %[src], 0, %[dst]\n"
                        "bne- 1b\n"
                        "li %[ret], 1\n"
                        "b 3f\n"
                        "2:\n"
                        "stwcx. %[ret], 0, %[dst]\n"
                        "li %[ret], 0\n"
                        "3:\n"
                        "isync\n"
                        : [ret] "=&r" (ret), "=m" (*dst)
                        : [dst] "r" (dst),
                          [exp] "r" (exp),
                          [src] "r" (src),
                          "m" (*dst)
                        : "cc", "memory");

        return ret;
}

 

rte_atomic32_cmpse

标签:mic   div   基本概念   mem   一致性   队列   compare   临时   sign   

原文地址:https://www.cnblogs.com/dream397/p/13646492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!