英語で読む

次の方法で共有


SpinWait 構造体

定義

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

C#
public struct SpinWait
継承
SpinWait

次の例は、 を使用する方法を SpinWait示しています。

C#
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);
    }
}

注釈

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)

指定した条件が満たされるか、指定したタイムアウトが経過するまで回転します。

適用対象

製品 バージョン
.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インスタンスを使用する必要があります。

こちらもご覧ください