atomic原子操作

结构体

typedef struct {
    int counter;
} atomic_t;

实际的内容就是一个int型的变量counter。

实现

对应的atomic操作有:

atomic_add
atomic_read
atomic_set
atomic_inc
atomic_dec
atomic_cmpxchg
atomic_xchg

我们以ARM平台为例,代码实现流程如下:

#define ATOMIC_OP(op, c_op, asm_op)                 \
static inline void atomic_##op(int i, atomic_t *v)          \
{                                   \
    unsigned long tmp;                      \
    int result;                         \
                                    \
    prefetchw(&v->counter);                     \
    __asm__ __volatile__("@ atomic_" #op "\n"           \
"1: ldrex   %0, [%3]\n"                     \                 //读取counter,并设置独占标记
"   " #asm_op " %0, %0, %4\n"                   \             //进行对应的操作
"   strex   %1, %0, [%3]\n"                     \             //根据独占标记,写入内存值,如果成功,则清除独占标记
"   teq %1, #0\n"                       \                     //检测tmp是否为0
"   bne 1b"                         \                         //如果不为0,说明获取独占访问权失败,跳转到1重新获取独占访问
    : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)       \
    : "r" (&v->counter), "Ir" (i)                   \
    : "cc");                            \
}                                   \

这里主要是汇编实现,利用ldrex和strex来独占访问内存,也就是我们的counter变量值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值