SpinWait 方法在实现锁定方面十分有用。 .NET Framework 中的类(例如 Monitor 和 ReaderWriterLock)在内部使用此方法。 SpinWait 实质上会将处理器置于十分紧密的循环中,其循环计数由 iterations 参数指定。 因此,等待的持续时间取决于处理器的速度。
针对这一点,将此方法与 Sleep 方法进行对比。 调用 Sleep 的线程会产生其处理器时间当前片断的剩余部分,即使指定的时间间隔为零也不例外。 如果为 Sleep 指定非零的时间间隔,则线程计划程序会不考虑该线程,直到该时间间隔结束。
SpinWait 并不广泛适用于普通应用程序。 在大多数情况下,应使用 .NET Framework 提供的同步类;例如,调用 Monitor.Enter 或包装 Monitor.Enter 的语句(在 C# 中为 lock,在 Visual Basic 中为 SyncLock)。
在避免上下文切换可带来益处的极少数情况下(例如,当已知即将发生状态更改时),应在循环中调用 SpinWait 方法。 SpinWait 执行的代码旨在防止可能在多处理器计算机上发生的问题。 例如,在具有多个采用 Hyper-Threading™ 技术的 Intel™ 处理器的计算机上,SpinWait 可防止在某些情况下出现处理器占用不足的现象。 |
SpinWait 结构
提供对基于自旋的等待的支持
SpinWait 封装常见旋转逻辑。 在单处理器计算机上,始终使用“生成”而不是“繁忙等待",在使用 Intel™ 处理器(采用超线程技术)的计算机上,它有助于防止硬件线程出现资源不足。 SpinWait 封装旋转与真正生成的良好混合。
SpinWait 是一种值类型,这意味着低级别代码可以利用 SpinWait 而不用担心不必要的分配开销。 SpinWait 并不广泛适用于普通应用程序。 在大多数情况下,应使用 .NET Framework 提供的同步类,如 Monitor。 在需要旋转等待的大多数情况下,SpinWait 类型应该优于 SpinWait 方法。