SpinWait Struktúra

Definíció

Támogatja a spin-alapú várakozást.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Öröklődés
SpinWait

Példák

Az alábbi példa bemutatja, hogyan használhatja a következőt 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

Megjegyzések

SpinWait beágyazza a gyakori forgó logikát. Az egyprocesszoros gépeken mindig a hozamokat használják a zsúfolt várakozások helyett, és a Hyper-Threading technológiát alkalmazó Intel processzorokkal rendelkező számítógépeken segít megelőzni a hardverszál-éhezést. A SpinWait a fonás és a valódi hozam jó keverékét foglalja magában.

SpinWait egy értéktípus, ami azt jelenti, hogy az alacsony szintű kód a SpinWait használatát anélkül tudja használni, hogy ne kelljen felesleges foglalási többletterhelésektől tartania. A SpinWait általában nem hasznos a szokásos alkalmazásokhoz. A legtöbb esetben a .NET-keretrendszer által biztosított szinkronizálási osztályokat kell használnia, például Monitor. A legtöbb olyan esetben, amikor pörgetéses várakozásra van szükség, a SpinWait típust előnyben kell részesíteni a Thread.SpinWait metódussal szemben.

Tulajdonságok

Name Description
Count

Lekérdezi, hogy hány alkalommal SpinOnce() lett meghívva a példány.

NextSpinWillYield

Lekérdezi, hogy SpinOnce() a következő hívás hozza-e létre a processzort, és kényszerített környezeti kapcsolót aktivál.

Metódusok

Name Description
Reset()

Alaphelyzetbe állítja a pörgetési számlálót.

SpinOnce()

Egyetlen pörgetést hajt végre.

SpinUntil(Func<Boolean>, Int32)

Pörgetés addig, amíg a megadott feltétel teljesül, vagy amíg a megadott időtúllépés el nem járt.

SpinUntil(Func<Boolean>, TimeSpan)

Pörgetés addig, amíg a megadott feltétel teljesül, vagy amíg a megadott időtúllépés el nem járt.

SpinUntil(Func<Boolean>)

Addig pörög, amíg a megadott feltétel teljesül.

A következőre érvényes:

Szálbiztonság

Bár SpinWait az egyidejű alkalmazásokban való használatra tervezték, nem több szálból való egyidejű használatra tervezték. SpinWait a tagok nem szálbiztosak. Ha több szálnak kell pörögnie, mindegyiknek a saját példányát kell használnia SpinWait.

Lásd még