SpinWait SpinWait SpinWait SpinWait Struct

定義

スピンベースの待機のサポートを提供します。Provides support for spin-based waiting.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
継承

次の例は、使用する方法を示します、 SpinWait:The following example shows how to use a 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 一般的なスピン ロジックをカプセル化します。SpinWait encapsulates common spinning logic. シングル プロセッサ コンピューターで生成されますが、ビジー状態の待機ではなく常に使用して、ハイパー スレッディング テクノロジを採用する Intel プロセッサを搭載したコンピューターのハードウェア スレッドの枯渇を防ぐに役立ちます。On single-processor machines, yields are always used instead of busy waits, and on computers with Intel processors employing Hyper-Threading technology, it helps to prevent hardware thread starvation. SpinWait には、回転とは true。 生成の適切な組み合わせがカプセル化します。SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWait 低レベルのコードが不要な割り当てオーバーヘッドを与えることがなく SpinWait を利用できることを意味します。 値の型です。SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait は通常のアプリケーションの一般的に便利ではありません。SpinWait is not generally useful for ordinary applications. ほとんどの場合など、.NET Framework によって提供される同期クラスを使用する必要がありますMonitorします。In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. スピン待機が必要な場合、ただし、ほとんどの場合、SpinWait型を優先する必要があります、Thread.SpinWaitメソッド。For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

プロパティ

Count Count Count Count

このインスタンスで SpinOnce() が呼び出された回数を取得します。Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield NextSpinWillYield NextSpinWillYield NextSpinWillYield

次に SpinOnce() を呼び出したときにプロセッサが生成され、強制的にコンテキストが切り替えられるかどうかを取得します。Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

メソッド

Reset() Reset() Reset() Reset()

スピン カウンターをリセットします。Resets the spin counter.

SpinOnce() SpinOnce() SpinOnce() SpinOnce()

単一のスピンを実行します。Performs a single spin.

SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32)
SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>)

指定した条件が満たされるまで回転します。Spins until the specified condition is satisfied.

SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32)

指定した条件が満たされるか、指定したタイムアウトが経過するまで回転します。Spins until the specified condition is satisfied or until the specified timeout is expired.

SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan)

指定した条件が満たされるか、指定したタイムアウトが経過するまで回転します。Spins until the specified condition is satisfied or until the specified timeout is expired.

適用対象

スレッド セーフ

中にSpinWaitは同時実行アプリケーションで使用するように設計、これが意図していません複数のスレッドから同時に使用します。While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. SpinWait メンバーは、スレッド セーフではありません。SpinWait members are not thread-safe. 各に独自のインスタンスを使用する必要がある場合、複数のスレッドを作成する必要があります、SpinWaitします。If multiple threads must spin, each should use its own instance of SpinWait.

こちらもご覧ください