static __inline__ int atomic_dec_and_test(atomic_t *v)
{
    unsigned char c;

    __asm__ __volatile__(
        LOCK "decl %0; sete %1"
        :"=m" (v->counter), "=qm" (c)
        :"m" (v->counter) : "memory");
    return c != 0;
}

这个实现让我很困惑
原子在这个函数中意味着什么?只有减少部分?
但是我们怎样才能确保sete返回正确的值呢?
我们需要禁用函数中的中断调用这个函数?,似乎原子只是这个函数中的一个句子(decl),而不是整个函数?

最佳答案

v是一个原子变量。对该变量的访问必须是原子的。decl指令是该函数中唯一访问v的指令,因此它是唯一需要确保原子访问的指令。之后,根据decl的结果设置一个局部变量(因此不能被不同的CPU/上下文访问)。
所以atomic_dec_and_test()意味着原子性地减少一个原子变量,并测试这是否导致达到一个零值。

10-08 18:22