应该何时使用Win32 InterlockedExchange功能?

EFr*_*ank 19 winapi multithreading

我遇到了InterlockedExchange函数,并想知道何时应该使用这个函数.在我看来,在x86处理器上设置32位值应该始终是原子的?
在我想使用该函数的情况下,新值不依赖于旧值(它不是增量操作).你能提供一个强制要求这个方法的例子(我不是在寻找InterlockedCompareExchange)

moo*_*dow 11

除了写入新值外,InterlockedExchange还读取并返回先前的值; 整个操作都是原子的.这对于无锁算法很有用.

(顺便说一句,32位写入不保证是原子的.例如,考虑写入未对齐并跨越缓存边界的情况.)


Jas*_*hen 10

InterlockedExchange是写入读取 - 它返回先前的值.

这是确保另一个线程在您执行之后不会写入不同值的必要条件.例如,假设您正在尝试增加变量.您可以读取值,添加1,然后使用设置新值InterlockedExchange.返回的值InterlockedExchange必须与您最初读取的值匹配,否则另一个线程可能会同时增加它,您需要循环并再次尝试.

  • 在这种情况下,我会使用InterlockedCompareExchange,因为检查该值是否仍然是原始值已由该方法完成. (3认同)
  • 或者只是InterlockedIncrement (3认同)

Nir*_*Nir 4

在多处理器或多核机器中,每个核心都有自己的缓存 - 因此每个核心对于系统内存的内容都有可能不同的“视图”。

线程同步机制负责核心之间的同步,有关更多信息,请参阅http://blogs.msdn.com/oldnewthing/archive/2008/10/03/8969397.aspx或 google 了解获取和释放语义

  • 缓存在这里是次要的。即使没有缓存并且 CPU 直接与内存通信,正常的读/写序列也不是原子的。 (2认同)