当前位置: 技术问答>linux和unix
asm volatile("incl %0":"+r"(b));是原子操作么。。。
来源: 互联网 发布时间:2016-09-08
本文导语: 本帖最后由 xiaowai0219 于 2010-07-02 13:40:23 编辑 asm volatile("incl %0":"+r"(b)); 请问这个是原子操作么?如果不是,那么要怎么改呢? ps:反汇编生成的对应的代码如下: movl _b, %eax /APP incl %eax /NO_APP movl %eax, _b ...
请问这个是原子操作么?如果不是,那么要怎么改呢?
ps:反汇编生成的对应的代码如下:
movl _b, %eax
/APP
incl %eax
/NO_APP
movl %eax, _b
|
X86下是这样定义的,
arch/x86/include/asm/alternative.h
用的时候这么弄
arch/x86/include/asm/alternative.h
#ifdef CONFIG_SMP
#define LOCK_PREFIX
".section .smp_locks,"a"n"
_ASM_ALIGN "n"
_ASM_PTR "661fn" /* address */
".previousn"
"661:ntlock; "
#else /* ! CONFIG_SMP */
#define LOCK_PREFIX ""
#endif
用的时候这么弄
static inline void atomic_add(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "addl %1,%0"
: "+m" (v->counter)
: "ir" (i));
}
|
atomic_inc()
|
LOCK 好象是条汇编指令,可以锁住系统数据总线,锁了总线当然就变成原操作了