原子操作是否足以实现互斥量?

Are atomic operations enough for a mutex?

仅仅是原子操作就足以在 x86 中实现互斥。我问的是关于无序执行的问题。除了对指定互斥锁是否锁定的整数的原子访问外,是否还有其他必须发生的操作,为什么?

答案取决于 "just atomic operations" 的意思。在 x86 上正确对齐 reads/writes 是原子的,Dekker 和 Peterson 的互斥锁算法都只使用读取和写入。但是,如果不使用(可能是隐式的)内存栅栏,这两种算法都无法正常工作。问题是这两种算法都假定了比 x86 更强的内存一致性模型。具体来说,如果两次访问不是针对同一地址,x86 允许在存储之后编程的加载更早发生。有关详细示例,请参阅 here

如果通过 "just atomic operations",您包括了 LOCK 前缀指令和 XCHG(具有隐式 LOCK 前缀),那么答案是肯定的,因为所述指令具有隐式内存栅栏。例如,XCHG 指令可用于执行 Dekker 和 Peterson 算法所需的顺序一致存储,或用于实现通常的测试和设置方法。