互锁变量访问

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

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

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

互锁 API

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

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

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

InterlockedCompareExchangeInterlockedCompare64Exchange128InterlockedCompareExchangePointer 函数将两个操作组合在一起:比较两个值,并根据比较结果将第三个值存储在其中一个变量中。

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

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

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

编译器内部函数

同步和多处理器问题