SpinWait Structure

Définition

Prend en charge l'attente basée sur les spins.Provides support for spin-based waiting.

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 :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

Remarques

SpinWait encapsule la logique de rotation courante.SpinWait encapsulates common spinning logic. Sur les ordinateurs à un seul processeur, les rendements sont toujours utilisés à la place des attentes occupées, et sur les ordinateurs équipés de processeurs Intel utilisant la technologie Hyper-Threading, cela permet d’éviter la privation de thread matériel.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. SpinWait encapsule un bon mélange de rotation et de vrai rendement.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWait est un type valeur, ce qui signifie que le code de bas niveau peut utiliser SpinWait sans crainte de frais d’allocation inutiles.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait n’est généralement pas utile pour les applications ordinaires.SpinWait is not generally useful for ordinary applications. Dans la plupart des cas, vous devez utiliser les classes de synchronisation fournies par le .NET Framework, comme Monitor.In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. Toutefois, dans la plupart des cas où la rotation en attente est requise, le type SpinWait doit être préféré à la méthode Thread.SpinWait.For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Propriétés

Count

Obtient le nombre de fois où SpinOnce() a été appelé sur cette instance.Gets the number of times SpinOnce() has been called on this 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é.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Méthodes

Reset()

Réinitialise le compteur de spins.Resets the spin counter.

SpinOnce()

Exécute un seul spin.Performs a single spin.

SpinOnce(Int32)

Effectue un seul spin et appelle Sleep(Int32) après un nombre minimal de spins.Performs a single spin and calls Sleep(Int32) after a minimum spin count.

SpinUntil(Func<Boolean>)

Effectue des spins jusqu'à ce que la condition spécifiée soit satisfaite.Spins until the specified condition is satisfied.

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.Spins until the specified condition is satisfied or until the specified timeout is expired.

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.Spins until the specified condition is satisfied or until the specified timeout is expired.

S’applique à

Cohérence de thread

Si SpinWait est conçu pour être utilisé dans les applications simultanées, il n’est pas conçu pour être utilisé simultanément à partir de plusieurs threads.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. les membres SpinWait ne sont pas thread-safe.SpinWait members are not thread-safe. Si plusieurs threads doivent tourner, chacun doit utiliser sa propre instance de SpinWait.If multiple threads must spin, each should use its own instance of SpinWait.

Voir aussi