SpinWait Estrutura

Definição

Fornece suporte à espera baseada em rotação.Provides support for spin-based waiting.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Herança
SpinWait

Exemplos

O exemplo a seguir mostra como usar um 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

Comentários

SpinWait encapsula a lógica de rotação comum.SpinWait encapsulates common spinning logic. Em computadores com um único processador, os resultados são sempre usados em vez de esperas ocupados e, em computadores com processadores Intel empregando Hyper-Threading tecnologia, ajuda a impedir a privação de threads de hardware.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. O SpinWait encapsula uma boa mistura de rotação e verdadeiro rendimento.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWait é um tipo de valor, o que significa que o código de baixo nível pode utilizar SpinWait sem medo de sobrecargas de alocação desnecessárias.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait geralmente não é útil para aplicativos comuns.SpinWait is not generally useful for ordinary applications. Na maioria dos casos, você deve usar as classes de sincronização fornecidas pelo .NET Framework, como Monitor .In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. No entanto, para a maioria das finalidades em que a rotação está aguardando é necessária, o SpinWait tipo deve ser preferível sobre o Thread.SpinWait método.For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Propriedades

Count

Obtém o número de vezes que SpinOnce() foi chamado nessa instância.Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield

Especifica se a próxima chamada para SpinOnce() produzirá o processador, disparando uma alternância de contexto forçado.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Métodos

Reset()

Redefine o contador de rotação.Resets the spin counter.

SpinOnce()

Executa uma única rotação.Performs a single spin.

SpinOnce(Int32)

Executa uma única rotação e chama Sleep(Int32) após uma contagem mínima de rotação.Performs a single spin and calls Sleep(Int32) after a minimum spin count.

SpinUntil(Func<Boolean>)

Gira até que a condição especificada seja atendida.Spins until the specified condition is satisfied.

SpinUntil(Func<Boolean>, Int32)

Gira até que a condição especificada seja atendida ou até que o tempo limite especificado expire.Spins until the specified condition is satisfied or until the specified timeout is expired.

SpinUntil(Func<Boolean>, TimeSpan)

Gira até que a condição especificada seja atendida ou até que o tempo limite especificado expire.Spins until the specified condition is satisfied or until the specified timeout is expired.

Aplica-se a

Acesso thread-safe

Embora o SpinWait seja projetado para ser usado em aplicativos simultâneos, ele não foi projetado para ser usado de vários threads simultaneamente.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. SpinWait os membros não são thread-safe.SpinWait members are not thread-safe. Se vários threads precisarem ser girados, cada um deve usar sua própria instância do SpinWait .If multiple threads must spin, each should use its own instance of SpinWait.

Veja também