互锁变量访问

应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行(完全或根本不执行)。

对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说,你最终不会只更新变量的一部分;所有位都以原子方式更新。 但是,不保证同步访问。 如果两个线程正在读取和写入同一个变量,则无法确定一个线程是否会在另一个线程执行写入作之前执行其读取作。

用于正确对齐的 64 位变量的简单读取和写入在 64 位 Windows 上是原子的。 在 32 位 Windows 上,不保证读取和写入 64 位值是原子值。 对于其他大小的变量的读取和写入,不能保证在任何平台上都是原子的。

互锁 API

联锁函数提供了一种简单的机制,用于同步对多个线程共享的变量的访问。 它们还以原子方式对变量执行作。 如果变量位于共享内存中,则不同进程的线程可以使用这些函数。

InterlockedIncrementInterlockedDecrement 函数结合了将变量递增或递减到原子作所涉及的步骤。 此功能在多任务作系统中非常有用,在该作系统中,系统可能会中断一个线程的执行,以向另一个线程授予一部分处理器时间。 如果没有此类同步,两个线程可以读取相同的值,将其递增 1,并将新值存储为 1 而不是 2 的新值。 联锁变量访问函数可防止出现此类错误。

InterlockedExchangeInterlockedExchangePointer 函数以原子方式交换指定变量的值。 InterlockedExchangeAdd 函数合并了两个作:一起添加两个变量,并将结果存储在其中一个变量中。

InterlockedCompareExchangeInterlockedCompare64Exchange128InterlockedCompareExchangePointer 函数组合了两个作:比较两个值并在其中一个变量中存储第三个值,具体取决于比较结果。

InterlockedAndInterlockedOrInterlockedXor 函数分别以原子方式执行 AND、OR 和 XOR作。

有一些函数专用于对 64 位内存值和地址执行互锁变量访问,并针对 64 位 Windows 的使用进行了优化。 其中每个函数都包含名称中的“64”;例如,InterlockedDecrement64InterlockedCompareExchangeAcquire64

大多数互锁函数在所有 Windows 平台上都提供完全内存屏障。 还有一些函数将基本互锁变量访问作与某些处理器支持的获取和释放内存排序语义相结合。 其中每个函数在其名称中包含“Acquire”或“Release”一词;例如,InterlockedDecrementAcquireInterlockedDecrementRelease。 获取内存语义指定在尝试任何其他内存作之前,当前线程执行的内存作将可见。 释放内存语义指定在完成所有其他内存作后,当前线程执行的内存作将可见。 借助这些语义,可以强制按特定顺序执行内存作。 在进入受保护区域时使用获取语义,并在离开时释放语义。

编译器内部函数

同步和多处理器问题