SpinWait 结构
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为基于自旋的等待提供支持。
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
- 继承
示例
以下示例演示如何使用 SpinWait:
using System;
using System.Threading;
using System.Threading.Tasks;
class SpinWaitDemo
{
// Demonstrates:
// SpinWait construction
// SpinWait.SpinOnce()
// SpinWait.NextSpinWillYield
// SpinWait.Count
static void Main()
{
bool someBoolean = false;
int numYields = 0;
// First task: SpinWait until someBoolean is set to true
Task t1 = Task.Factory.StartNew(() =>
{
SpinWait sw = new SpinWait();
while (!someBoolean)
{
// The NextSpinWillYield property returns true if
// calling sw.SpinOnce() will result in yielding the
// processor instead of simply spinning.
if (sw.NextSpinWillYield) numYields++;
sw.SpinOnce();
}
// As of .NET Framework 4: After some initial spinning, SpinWait.SpinOnce() will yield every time.
Console.WriteLine("SpinWait called {0} times, yielded {1} times", sw.Count, numYields);
});
// Second task: Wait 100ms, then set someBoolean to true
Task t2 = Task.Factory.StartNew(() =>
{
Thread.Sleep(100);
someBoolean = true;
});
// Wait for tasks to complete
Task.WaitAll(t1, t2);
}
}
Imports System.Threading
Imports System.Threading.Tasks
Module SpinWaitDemo
' Demonstrates:
' SpinWait construction
' SpinWait.SpinOnce()
' SpinWait.NextSpinWillYield
' SpinWait.Count
Private Sub SpinWaitSample()
Dim someBoolean As Boolean = False
Dim numYields As Integer = 0
' First task: SpinWait until someBoolean is set to true
Dim t1 As Task = Task.Factory.StartNew(
Sub()
Dim sw As New SpinWait()
While Not someBoolean
' The NextSpinWillYield property returns true if
' calling sw.SpinOnce() will result in yielding the
' processor instead of simply spinning.
If sw.NextSpinWillYield Then
numYields += 1
End If
sw.SpinOnce()
End While
' As of .NET Framework 4: After some initial spinning, SpinWait.SpinOnce() will yield every time.
Console.WriteLine("SpinWait called {0} times, yielded {1} times", sw.Count, numYields)
End Sub)
' Second task: Wait 100ms, then set someBoolean to true
Dim t2 As Task = Task.Factory.StartNew(
Sub()
Thread.Sleep(100)
someBoolean = True
End Sub)
' Wait for tasks to complete
Task.WaitAll(t1, t2)
End Sub
End Module
注解
SpinWait 封装常见的旋转逻辑。 在单处理器计算机上,生成始终使用,而不是忙于等待,在采用Hyper-Threading技术的 Intel 处理器的计算机上,这有助于防止硬件线程饥饿。 SpinWait 封装了旋转和真实产量的良好混合物。
SpinWait 是一种值类型,这意味着低级别代码可以利用 SpinWait,而不必担心不必要的分配开销。 SpinWait 通常不适用于普通应用程序。 在大多数情况下,应使用.NET Framework提供的同步类,例如Monitor。 但是,对于需要旋转等待的大多数用途, SpinWait 类型应优先于 Thread.SpinWait 该方法。
属性
Count |
获取已对此实例调用 SpinOnce() 的次数。 |
NextSpinWillYield |
获取对 SpinOnce() 的下一次调用是否将产生处理器,同时触发强制上下文切换。 |
方法
Reset() |
重置自旋计数器。 |
SpinOnce() |
执行单一自旋。 |
SpinOnce(Int32) |
执行单一自旋,并在达到最小旋转计数后调用 Sleep(Int32)。 |
SpinUntil(Func<Boolean>) |
在指定条件得到满足之前自旋。 |
SpinUntil(Func<Boolean>, Int32) |
在指定条件得到满足或指定超时过期之前自旋。 |
SpinUntil(Func<Boolean>, TimeSpan) |
在指定条件得到满足或指定超时过期之前自旋。 |
适用于
线程安全性
虽然 SpinWait 设计为在并发应用程序中使用,但它不设计用于多个线程。 SpinWait 成员不是线程安全的。 如果多个线程必须旋转,则每个线程都应使用其自己的实例 SpinWait。