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