SpinWait Struktura
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia obsługę oczekiwania opartego na spinach.
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
- Dziedziczenie
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.