atomic原子操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/86543635

结构体

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变量值。

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/86543635