SpinWait Struktura

Definicja

Zapewnia obsługę czekania na wirowanie.Provides support for spin-based waiting.

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

Przykłady

Poniższy przykład pokazuje, jak używać 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

Uwagi

SpinWait hermetyzuje wspólną, obracającą się logiką.SpinWait encapsulates common spinning logic. Na maszynach z jednym procesorem wartości są zawsze używane zamiast zajętego oczekiwania, a na komputerach z procesorami Intel wykorzystujących technologię wielowątkowości można zapobiegać zastępowaniu wątku sprzętowego.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. Metody SpinWait hermetyzuje dobrą kombinację wirowania i wartości true.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWait jest typem wartości, co oznacza, że kod niskiego poziomu może korzystać z Metody SpinWait bez obaw o niepotrzebne koszty alokacji.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. Metody SpinWait nie jest ogólnie przydatna w przypadku zwykłych aplikacji.SpinWait is not generally useful for ordinary applications. W większości przypadków należy używać klas synchronizacji dostarczonych przez .NET Framework, takich jak Monitor.In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. W większości przypadków, gdy wymagane jest oczekiwanie, jednak typ SpinWait powinien być preferowany przez metodę Thread.SpinWait.For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Właściwości

Count

Pobiera liczbę przypadków wywołania SpinOnce() w tym wystąpieniu.Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield

Pobiera, czy następne wywołanie SpinOnce() będzie zwracać procesor, wyzwalając wymuszony przełącznik kontekstu.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Metody

Reset()

Resetuje licznik pokrętła.Resets the spin counter.

SpinOnce()

Wykonuje pojedynczy pokrętło.Performs a single spin.

SpinOnce(Int32)

Wykonuje pojedyncze wirowanie i wywołuje Sleep(Int32) po minimalnej liczbie obrotów.Performs a single spin and calls Sleep(Int32) after a minimum spin count.

SpinUntil(Func<Boolean>)

Obraca do momentu spełnienia określonego warunku.Spins until the specified condition is satisfied.

SpinUntil(Func<Boolean>, Int32)

Obraca do momentu spełnienia określonego warunku lub do czasu wygaśnięcia określonego limitu czasu.Spins until the specified condition is satisfied or until the specified timeout is expired.

SpinUntil(Func<Boolean>, TimeSpan)

Obraca do momentu spełnienia określonego warunku lub do czasu wygaśnięcia określonego limitu czasu.Spins until the specified condition is satisfied or until the specified timeout is expired.

Dotyczy

Bezpieczeństwo wątkowe

Mimo że SpinWait jest zaprojektowana do użycia w współbieżnych aplikacjach, nie jest ona przeznaczona do użycia z wielu wątków jednocześnie.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. składowe SpinWait nie są bezpieczne wątkowo.SpinWait members are not thread-safe. Jeśli wiele wątków musi się obracać, każdy powinien używać własnego wystąpienia SpinWait.If multiple threads must spin, each should use its own instance of SpinWait.

Zobacz też