用于非无锁类型的Visual C ++ 2012 std :: atomic使用自旋锁 - 但是抢先呢?

时间:2014-03-27 21:18:35

标签: windows multithreading winapi visual-c++ c++11

查看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的非空白。)

0 个答案:

没有答案