SpinWait Struktúra
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Támogatja a spin-alapú várakozást.
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
- Öröklődés
Példák
Az alábbi példa bemutatja, hogyan használhatja a következőt 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
Megjegyzések
SpinWait beágyazza a gyakori forgó logikát. Az egyprocesszoros gépeken mindig a hozamokat használják a zsúfolt várakozások helyett, és a Hyper-Threading technológiát alkalmazó Intel processzorokkal rendelkező számítógépeken segít megelőzni a hardverszál-éhezést. A SpinWait a fonás és a valódi hozam jó keverékét foglalja magában.
SpinWait egy értéktípus, ami azt jelenti, hogy az alacsony szintű kód a SpinWait használatát anélkül tudja használni, hogy ne kelljen felesleges foglalási többletterhelésektől tartania. A SpinWait általában nem hasznos a szokásos alkalmazásokhoz. A legtöbb esetben a .NET-keretrendszer által biztosított szinkronizálási osztályokat kell használnia, például Monitor. A legtöbb olyan esetben, amikor pörgetéses várakozásra van szükség, a SpinWait típust előnyben kell részesíteni a Thread.SpinWait metódussal szemben.
Tulajdonságok
| Name | Description |
|---|---|
| Count |
Lekérdezi, hogy hány alkalommal SpinOnce() lett meghívva a példány. |
| NextSpinWillYield |
Lekérdezi, hogy SpinOnce() a következő hívás hozza-e létre a processzort, és kényszerített környezeti kapcsolót aktivál. |
Metódusok
| Name | Description |
|---|---|
| Reset() |
Alaphelyzetbe állítja a pörgetési számlálót. |
| SpinOnce() |
Egyetlen pörgetést hajt végre. |
| SpinUntil(Func<Boolean>, Int32) |
Pörgetés addig, amíg a megadott feltétel teljesül, vagy amíg a megadott időtúllépés el nem járt. |
| SpinUntil(Func<Boolean>, TimeSpan) |
Pörgetés addig, amíg a megadott feltétel teljesül, vagy amíg a megadott időtúllépés el nem járt. |
| SpinUntil(Func<Boolean>) |
Addig pörög, amíg a megadott feltétel teljesül. |
A következőre érvényes:
Szálbiztonság
Bár SpinWait az egyidejű alkalmazásokban való használatra tervezték, nem több szálból való egyidejű használatra tervezték. SpinWait a tagok nem szálbiztosak. Ha több szálnak kell pörögnie, mindegyiknek a saját példányát kell használnia SpinWait.