查看C ++ 11 std原子的Visual C ++ 2012实现,而整数大小的实现基于互锁指令,在xatomic.h中我们看到:
/* ATOMIC OPERATIONS FOR OBJECTS WITH SIZES THAT DON'T MATCH THE SIZE OF ANY INTEGRAL TYPE */
然后您会看到依赖于_Lock_spin_lock(_Flag)
的操作,这是通常的_interlockedbittestandset
循环。
我认为不能在用户模式代码中使用自旋锁,因为线程可以在解锁之前被抢占,并且等待锁的任何线程都将忙于等待。虽然CriticalSection
或SRW锁具有显着的开销,但是可以旋转固定次数,然后才使用较重的内核锁。
他们为什么不这样做?在非ARM平台上,它们的自旋锁在迭代内部甚至不会产生(_YIELD_PROCESSOR
仅被定义为ARM的非空白。)