SpinWait 構造体

定義

スピンベースの待機のサポートを提供します。

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
継承
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 は、通常のアプリケーションには一般的には役に立ちません。 ほとんどの場合、Monitor など、.NET Framework によって提供される同期クラスを使用する必要があります。 ただし、スピン待機が必要なほとんどの場合は、 SpinWait の種類を Thread.SpinWait メソッドよりも優先する必要があります。

プロパティ

名前 説明
Count

このインスタンスで SpinOnce() が呼び出された回数を取得します。

NextSpinWillYield

SpinOnce()への次の呼び出しによってプロセッサが生成され、強制的なコンテキスト スイッチがトリガーされるかどうかを取得します。

メソッド

名前 説明
Reset()

スピン カウンターをリセットします。

SpinOnce()

1 回のスピンを実行します。

SpinUntil(Func<Boolean>, Int32)

指定した条件が満たされるか、指定されたタイムアウトが期限切れになるまでスピンします。

SpinUntil(Func<Boolean>, TimeSpan)

指定した条件が満たされるか、指定されたタイムアウトが期限切れになるまでスピンします。

SpinUntil(Func<Boolean>)

指定した条件が満たされるまでスピンします。

適用対象

スレッド セーフ

SpinWaitは同時実行アプリケーションで使用するように設計されていますが、複数のスレッドから同時に使用するようには設計されていません。 SpinWait メンバーはスレッド セーフではありません。 複数のスレッドがスピンする必要がある場合は、それぞれが独自の SpinWaitインスタンスを使用する必要があります。

こちらもご覧ください