Partager via


SpinWait Structure

Définition

Prend en charge l'attente basée sur les spins.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Héritage
SpinWait

Exemples

L’exemple suivant montre comment utiliser un 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

Remarques

SpinWait encapsule une logique de rotation courante. Sur les ordinateurs à processeur unique, les rendements sont toujours utilisés au lieu d’attentes occupées et sur les ordinateurs dotés de processeurs Intel utilisant Hyper-Threading technologie, il permet d’éviter la famine des threads matériels. SpinWait encapsule un bon mélange de rotation et de rendement réel.

SpinWait est un type valeur, ce qui signifie que le code de bas niveau peut utiliser SpinWait sans craindre de surcharges d’allocation inutiles. SpinWait n’est généralement pas utile pour les applications ordinaires. Dans la plupart des cas, vous devez utiliser les classes de synchronisation fournies par le .NET Framework, telles que Monitor. Dans la plupart des cas où l’attente de spin est requise, toutefois, le SpinWait type doit être préféré à la Thread.SpinWait méthode.

Propriétés

Count

Obtient le nombre de fois où SpinOnce() a été appelé sur cette instance.

NextSpinWillYield

Obtient une valeur qui indique si l'appel suivant à SpinOnce() générera le processeur, en déclenchant un changement de contexte forcé.

Méthodes

Reset()

Réinitialise le compteur de spins.

SpinOnce()

Exécute un seul spin.

SpinOnce(Int32)

Effectue un seul spin et appelle Sleep(Int32) après un nombre minimal de spins.

SpinUntil(Func<Boolean>)

Effectue des spins jusqu'à ce que la condition spécifiée soit satisfaite.

SpinUntil(Func<Boolean>, Int32)

Effectue des spins jusqu'à ce que la condition spécifiée soit satisfaite ou jusqu'à ce que le délai d'attente expire.

SpinUntil(Func<Boolean>, TimeSpan)

Effectue des spins jusqu'à ce que la condition spécifiée soit satisfaite ou jusqu'à ce que le délai d'attente expire.

S’applique à

Cohérence de thread

Bien qu’il SpinWait soit conçu pour être utilisé dans des applications simultanées, il n’est pas conçu pour être utilisé simultanément à partir de plusieurs threads. SpinWait les membres ne sont pas thread-safe. Si plusieurs threads doivent tourner, chacun doit utiliser sa propre instance de SpinWait.

Voir aussi