SpinWait Struktur
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt Unterstützung für Spin-basierte Wartevorgänge bereit.
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
- Vererbung
Beispiele
Im folgenden Beispiel wird gezeigt, wie Sie eine 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
SpinWait Kapselt häufige Spinnlogik. Auf Einzelprozessorcomputern werden Die Renditen immer anstelle von gebuchten Wartezeiten verwendet, und auf Computern mit Intel-Prozessoren, die Hyper-Threading Technologie verwenden, hilft es, Hardwarethread-Starvation zu verhindern. SpinWait kapselt eine gute Mischung aus Drehung und wahrer Rendite.
SpinWait ist ein Werttyp, der bedeutet, dass Der Code mit niedriger Ebene SpinWait ohne Angst vor unnötigen Zuordnungsaufwand nutzen kann. SpinWait ist in der Regel nicht für normale Anwendungen nützlich. In den meisten Fällen sollten Sie die Synchronisierungsklassen verwenden, die von den .NET Framework bereitgestellt werden, zMonitor. B. . Für die meisten Zwecke, bei denen Spin-Warten erforderlich ist, sollte der SpinWait Typ jedoch über die Thread.SpinWait Methode bevorzugt werden.
Eigenschaften
Count |
Ruft die Anzahl von SpinOnce()-Aufrufen für diese Instanz ab. |
NextSpinWillYield |
Ruft einen Wert ab, der angibt, ob der nächste Aufruf von SpinOnce() den Prozessor ergibt und einen erzwungenen Kontextwechsel auslöst. |
Methoden
Reset() |
Setzt die Spin-Anzahl zurück. |
SpinOnce() |
Führt einen Spin-Vorgang aus. |
SpinOnce(Int32) |
Führt einen einzelnen Spin durch und ruft Sleep(Int32) nach einer minimalen Spinanzahl auf. |
SpinUntil(Func<Boolean>) |
Führt Spin-Vorgänge aus, bis die angegebene Bedingung erfüllt wird. |
SpinUntil(Func<Boolean>, Int32) |
Führt Spin-Vorgänge aus, bis die angegebene Bedingung erfüllt wird oder das angegebene Timeout abgelaufen ist. |
SpinUntil(Func<Boolean>, TimeSpan) |
Führt Spin-Vorgänge aus, bis die angegebene Bedingung erfüllt wird oder das angegebene Timeout abgelaufen ist. |
Gilt für
Threadsicherheit
Während SpinWait sie in gleichzeitigen Anwendungen verwendet werden sollen, ist es nicht so konzipiert, dass es gleichzeitig von mehreren Threads verwendet werden soll. SpinWait Mitglieder sind nicht threadsicher. Wenn mehrere Threads drehen müssen, sollte jede eine eigene Instanz von SpinWait.