关键节内的InterlockedExchange(或类似的原子操作)

InterlockedExchange (or similar atomic operation) within a Critical Section?

本文关键字:原子操作 InterlockedExchange      更新时间:2023-10-16

我看到一些重复的代码(确切地说是方法),它们进入关键部分,然后使用InterlockedExchange。。。这有意义吗,因为我认为这个操作实际上是原子操作,不需要这样的同步?

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

这基本上就是…

正常交换通常不是原子交换。然而,如果所有其他用途都受到同一个互斥体的保护,那么在拥有互斥体的情况下这样做是可以的。如果所有其他用途都是原子的,那么使用原子交换也是可以的。我能想到的在拥有互斥体的同时进行原子交换的唯一逻辑原因是,并不是所有对该值的使用都是受互斥体保护的。

单个原子操作不需要CS,但它可以充当围栏,在锁保持全局可见时更改任何内容(IIRC,显式围栏适用于SSE2+,但互锁操作根本不需要SSE),但它需要在任何全局存储之后

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