关键部分内的InterlockedExchange(或类似的原子操作)?

时间:2012-02-16 09:43:42

标签: c++ synchronization critical-section

我已经看到了一些重复的代码(准确的方法),他们进入临界区然后使用InterlockedExchange ...这是否有意义,因为我认为这个操作实际上是原子的,不需要这样的同步? / p>

{ 
  EnterCricSectionLock lock (somelock);
  InterlockedExchange(&somelong, static_cast<long>(newlongVal));
}

这基本上就是......

2 个答案:

答案 0 :(得分:1)

正常交换通常不是原子的。但是,如果所有其他用途都受相同的互斥锁保护,则可以在拥有互斥锁的情况下执行此操作。如果所有其他用途都是原子的,那么使用原子交换也是可以的。我可以想到在拥有互斥锁时进行原子交换的唯一合乎逻辑的原因是,并非所有对此值的使用都受到互斥保护。

答案 1 :(得分:1)

单个原子操作不需要CS,但是当锁保持全局可见时,它可以充当围栏来进行任何改变(IIRC,显式围栏用于SSE2 +,但是互锁操作不需要SSE所有),然而它需要任何全球商店之后。

这可能有意义的是CS用于锁定对其他内容的访问,因此全局交换不是锁定的一部分。