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() が呼び出された回数を取得します。 |
Next |
次に SpinOnce() を呼び出したときにプロセッサが生成され、強制的にコンテキストが切り替えられるかどうかを取得します。 |
Reset() |
スピン カウンターをリセットします。 |
Spin |
単一のスピンを実行します。 |
Spin |
単一のスピンを実行して、スピンの最小回数の後に Sleep(Int32) を呼び出します。 |
Spin |
指定した条件が満たされるまで回転します。 |
Spin |
指定した条件が満たされるか、指定したタイムアウトが経過するまで回転します。 |
Spin |
指定した条件が満たされるか、指定したタイムアウトが経過するまで回転します。 |
製品 | バージョン |
---|---|
.NET | Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 |
.NET Framework | 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1 |
.NET Standard | 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1 |
UWP | 10.0 |
SpinWaitは同時アプリケーションで使用するように設計されていますが、複数のスレッドから同時に使用するようには設計されていません。 SpinWait メンバーはスレッド セーフではありません。 複数のスレッドをスピンする必要がある場合は、それぞれの スレッドで の独自の SpinWaitインスタンスを使用する必要があります。
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。