Udostępnij za pośrednictwem


SpinWait Struktura

Definicja

Zapewnia obsługę oczekiwania opartego na spinach.

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

Przykłady

W poniższym przykładzie pokazano, jak używać elementu 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

Uwagi

SpinWait hermetyzuje typową logikę wirowania. Na maszynach z jednym procesorem wydajność jest zawsze używana zamiast zajętych oczekiwania, a na komputerach z procesorami Intel wykorzystującymi Hyper-Threading technologii pomaga zapobiegać głodowaniu wątków sprzętowych. SpinWait hermetyzuje dobrą mieszankę przędzenia i prawdziwego plonowania.

SpinWait jest typem wartości, co oznacza, że kod niskiego poziomu może korzystać z metody SpinWait bez obawy przed niepotrzebnymi obciążeniami alokacji. SpinWait nie jest zwykle przydatny w zwykłych zastosowaniach. W większości przypadków należy użyć klas synchronizacji udostępnianych przez .NET Framework, takich jak Monitor. W większości celów, w których wymagane jest oczekiwanie na spin, SpinWait jednak typ powinien być preferowany przez metodę Thread.SpinWait .

Właściwości

Count

Pobiera liczbę wywołań SpinOnce() dla tego wystąpienia.

NextSpinWillYield

Pobiera, czy następne wywołanie SpinOnce() metody zwróci procesor, wyzwalając wymuszony przełącznik kontekstu.

Metody

Reset()

Resetuje licznik pokrętła.

SpinOnce()

Wykonuje pojedynczy obrót.

SpinOnce(Int32)

Wykonuje pojedynczy obrót i wywołuje Sleep(Int32) po minimalnej liczbie obrotów.

SpinUntil(Func<Boolean>)

Obraca się do momentu spełnienia określonego warunku.

SpinUntil(Func<Boolean>, Int32)

Obraca się do momentu spełnienia określonego warunku lub do momentu wygaśnięcia określonego limitu czasu.

SpinUntil(Func<Boolean>, TimeSpan)

Obraca się do momentu spełnienia określonego warunku lub do momentu wygaśnięcia określonego limitu czasu.

Dotyczy

Bezpieczeństwo wątkowe

Chociaż SpinWait jest przeznaczony do użycia w aplikacjach współbieżnych, nie jest przeznaczony do użycia z wielu wątków jednocześnie. SpinWait elementy członkowskie nie są bezpieczne wątkowo. Jeśli wiele wątków musi być uruchamianych, każdy z nich powinien używać własnego wystąpienia klasy SpinWait.

Zobacz też