据说以“lock”为前缀的汇编指令是原子性的。我想知道“lock”是否只能影响一个汇编指令;汇编指令本身是否不具备原子性?
以下是Linux内核中原子函数的示例:
在这个例子中,subl和sete可以被打断吗?
以下是Linux内核中原子函数的示例:
static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
{ unsigned char c;
__asm__ __volatile__(
LOCK "subl %2,%0; sete %1"
:"=m" (v->counter), "=qm" (c)
:"ir" (i), "m" (v->counter) : "memory");
return c; }
在这个例子中,subl和sete可以被打断吗?
sete(mem)
将是原子存储。它不是RMW,只是一个字节存储(从FLAGS派生的值),因此它是微不足道的原子操作; x86保证在所有情况下单字节存储的原子性。(它不是与“lock sub”相同事务的一部分,并且正在操作一个未共享的变量,因此对于这种用例来说完全不相关。针对窄对齐的纯负载和纯存储的原子性相对简单,在大多数CPU中基本上可以免费实现。) - Peter Cordes