SpinWait Struktura

Definicja

Zapewnia obsługę oczekiwania opartego na spinach.

C#
public struct SpinWait
Dziedziczenie
SpinWait

Przykłady

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

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

Produkt Wersje
.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
.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
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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ż