我已经看到了一些重复的代码(准确的方法),他们进入临界区然后使用InterlockedExchange ...这是否有意义,因为我认为这个操作实际上是原子的,不需要这样的同步? / p>
{
EnterCricSectionLock lock (somelock);
InterlockedExchange(&somelong, static_cast<long>(newlongVal));
}
这基本上就是......
答案 0 :(得分:1)
正常交换通常不是原子的。但是,如果所有其他用途都受相同的互斥锁保护,则可以在拥有互斥锁的情况下执行此操作。如果所有其他用途都是原子的,那么使用原子交换也是可以的。我可以想到在拥有互斥锁时进行原子交换的唯一合乎逻辑的原因是,并非所有对此值的使用都受到互斥保护。
答案 1 :(得分:1)
单个原子操作不需要CS,但是当锁保持全局可见时,它可以充当围栏来进行任何改变(IIRC,显式围栏用于SSE2 +,但是互锁操作不需要SSE所有),然而它需要在任何全球商店之后。
这可能有意义的是CS用于锁定对其他内容的访问,因此全局交换不是锁定的一部分。