原子变量
普通变量count++:
看起来是一句话:实际是三个步骤:第一:首先要把这个变量在内存当中取到CPU:第二:把这个变量进行++;第三:把这个变量的值送回内存:所以这是分了三个步骤:每一个步骤都有可能被打断,所以对这个值的操作不原子.
原子:即一气呵成:
一旦成功,则所有过程都成功,一旦失败,所有过程都失败.所以原子变量并不是不可被打断的.
原子变量count++:
也是分成三个步骤:前两个步骤与普通变量一样:第三个步骤:在进行往内存写的时候,会检测是否在我取出之后这个变量被重新写入过,如果被写入过,则重新把这个变量读取出来进行++,然后在写入.(这个功能实现的方式是在下面这个atomic.h中的一段内嵌汇编实现的)
vim arch/arm/include/asm/atomic.h这个头文件是原子变量相关的代码,下面列出一个例子
39 static inline void atomic_add(int i, atomic_t *v)
40 {
41 unsigned long tmp;
42 int result;
43
44 __asm__ __volatile__("@ atomic_add\n"
45 "1: ldrex %0, [%3]\n"
46 " add %0, %0, %4\n"
47 " strex %1, %0, [%3]\n"
48 " teq %1, #0\n"
49 " bne 1b"
50 : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
51 : "r" (&v->counter), "Ir" (i)
52 : "cc");
53 }
插曲:中断除了正在运行的指令不可以打断,其他任何过程都可以打断:在不可抢占的内核的一段代码:在之前屏蔽中断,操作之后再打开中断,这样中间的一段代码是不可能被其他任何情况打断了.
标签:__,变量,++,步骤,原子,互斥,atomic From: https://www.cnblogs.com/axjlxy/p/18056650