SpinWait SpinWait SpinWait SpinWait Struct

Definizione

Fornisce il supporto per l'attesa basata su rotazione.Provides support for spin-based waiting.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Ereditarietà

Esempi

Nell'esempio seguente viene illustrato come utilizzare 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

Commenti

SpinWait incapsula la logica di rotazione comune.SpinWait encapsulates common spinning logic. Nei computer a processore singolo, produce vengono sempre utilizzati invece attese occupate e nei computer con processori Intel basati su tecnologia Hyper-Threading, consente di evitare l'esaurimento dei thread 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. SpinWait incapsula una combinazione ottima di rotazione e resa effettiva.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWait è un tipo di valore che indica che il codice di basso livello possa utilizzare SpinWait senza timore di costi generali di allocazione non necessaria.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait non è in genere utile per le applicazioni comuni.SpinWait is not generally useful for ordinary applications. Nella maggior parte dei casi, è consigliabile usare le classi di sincronizzazione fornite da .NET Framework, ad esempio Monitor.In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. Maggior parte dei casi in cui in attesa di selezione è necessario, tuttavia, il SpinWait il tipo deve essere preferito rispetto di Thread.SpinWait (metodo).For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Proprietà

Count Count Count Count

Ottiene il numero di chiamate di SpinOnce() su questa istanza.Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield NextSpinWillYield NextSpinWillYield NextSpinWillYield

Ottiene un valore che indica se la chiamata successiva a SpinOnce() comporterà la cessione del processore, attivando un cambio imposto di contesto.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Metodi

Reset() Reset() Reset() Reset()

Reimposta il contatore delle rotazioni.Resets the spin counter.

SpinOnce() SpinOnce() SpinOnce() SpinOnce()

Esegue una sola rotazione.Performs a single spin.

SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32)
SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>)

Esegue rotazioni finché non è stata soddisfatta la condizione specificata.Spins until the specified condition is satisfied.

SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32)

Esegue rotazioni finché non è stata soddisfatta la condizione specificata o fino allo scadere del timeout specificato.Spins until the specified condition is satisfied or until the specified timeout is expired.

SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan)

Esegue rotazioni finché non è stata soddisfatta la condizione specificata o fino allo scadere del timeout specificato.Spins until the specified condition is satisfied or until the specified timeout is expired.

Si applica a

Thread safety

Mentre SpinWait è progettato per essere usato nelle applicazioni concorrenti, non è progettato per essere usati da più thread contemporaneamente.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. SpinWait i membri non sono thread-safe.SpinWait members are not thread-safe. Se è necessario avviare più thread, ognuno deve usare la propria istanza di SpinWait.If multiple threads must spin, each should use its own instance of SpinWait.

Vedi anche