- 论坛徽章:
- 0
|
这和编译器有关吧,同一编译器的优化配置也会有不同结果
int i;
void add_1()
{
++i;
}
void add_2()
{
i++;
}
void add_3()
{
i = i + 1;
}
三个函数用GCC编译,在O0即不优化的情况下都编译为:(gcc test.c -S -O0)
movl i, %eax
addl $1, %eax
movl %eax, i
三条指令
而在O1以上都会优化为一条:addl $1, i
中断只会发生在指令之间,所以在单核cpu的情况下能在单条指令下完成的操作都叫原子的,但是多cpu中即使单条指令可以完成的操作也不一定是原子的,因为有的单个指令也可以分解为多个“微操作”如“读-改-写”,所以多i386提供了对总线加锁的手段,看下内核中的atomic_add函数就明白了
static inline void atomic_add(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "addl %1, %0"
:: "+m" (v->counter)
:: "ir" (i));
}
所以不管怎么样,个人认为在gcc下三个写法是一样的 |
|