SpinWait SpinWait SpinWait SpinWait Struct

Definition

Stellt Unterstützung für Spin-basierte Wartevorgänge bereit.Provides support for spin-based waiting.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Vererbung

Beispiele

Im folgenden Beispiel wird gezeigt, wie ein SpinWaitverwendet wird: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

Hinweise

SpinWaitkapselt gängige spininglogik.SpinWait encapsulates common spinning logic. Auf Computern mit nur einem Prozessor werden die Ergebnisse immer anstelle von ausgelasteten warte Vorgängen verwendet, und auf Computern mit Intel-Prozessoren, die Hyperthreadingtechnologie verwenden, hilft es, den Hardware Thread Hunger zu verhindern.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 kapselt eine gute Mischung aus spinzeiten und echten Ergebnisse.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWaitist ein Werttyp. Dies bedeutet, dass auf Low-Level-Code SpinWait verwendet werden kann, ohne dass unnötige Zuweisungs Übersichten zu befürchten sind.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait ist in der Regel nicht für normale Anwendungen nützlich.SpinWait is not generally useful for ordinary applications. In den meisten Fällen sollten Sie die Synchronisierungs Klassen verwenden, die vom .NET Framework bereitgestellt Monitorwerden, z. b.In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. In den meisten Fällen, in denen das warten auf die Warte SpinWait Schlange erforderlich ist, sollte der Thread.SpinWait Typ für die Methode bevorzugt werden.For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Eigenschaften

Count Count Count Count

Ruft die Anzahl von SpinOnce()-Aufrufen für diese Instanz ab.Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield NextSpinWillYield NextSpinWillYield NextSpinWillYield

Ruft einen Wert ab, der angibt, ob der nächste Aufruf von SpinOnce() den Prozessor ergibt und einen erzwungenen Kontextwechsel auslöst.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Methoden

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

Setzt die Spin-Anzahl zurück.Resets the spin counter.

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

Führt einen Spin-Vorgang aus.Performs a single spin.

SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32)

Führt einen einzelnen Spin durch und ruft Sleep(Int32) nach einer minimalen Spinanzahl auf.Performs a single spin and calls Sleep(Int32) after a minimum spin count.

SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>)

Führt Spin-Vorgänge aus, bis die angegebene Bedingung erfüllt wird.Spins until the specified condition is satisfied.

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

Führt Spin-Vorgänge aus, bis die angegebene Bedingung erfüllt wird oder das angegebene Timeout abgelaufen ist.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)

Führt Spin-Vorgänge aus, bis die angegebene Bedingung erfüllt wird oder das angegebene Timeout abgelaufen ist.Spins until the specified condition is satisfied or until the specified timeout is expired.

Gilt für:

Threadsicherheit

SpinWait Ist für die Verwendung in gleichzeitigen Anwendungen konzipiert und ist nicht für die gleichzeitige Verwendung durch mehrere Threads konzipiert.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. SpinWaitMember sind nicht Thread sicher.SpinWait members are not thread-safe. Wenn mehrere Threads gedreht werden müssen, sollte jeweils eine eigene Instanz von SpinWaitverwendet werden.If multiple threads must spin, each should use its own instance of SpinWait.

Siehe auch