Leggere in inglese

Condividi tramite


SpinWait Struct

Definizione

Fornisce il supporto per l'attesa basata su rotazione.

C#
public struct SpinWait
Ereditarietà
SpinWait

Esempio

Nell'esempio seguente viene illustrato come usare un oggetto SpinWait:

C#
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);
    }
}

Commenti

SpinWait incapsula la logica di rotazione comune. Nei computer a processore singolo, i rendimenti vengono sempre usati invece di attese occupate e nei computer con processori Intel che usano la tecnologia Hyper-Threading, consente di evitare la fame di thread hardware. SpinWait incapsula una buona miscela di filatura e vero rendimento.

SpinWait è un tipo di valore, il che significa che il codice di basso livello può usare SpinWait senza timore di sovraccarichi di allocazione non necessari. SpinWait non è in genere utile per le applicazioni normali. Nella maggior parte dei casi, è consigliabile usare le classi di sincronizzazione fornite da .NET Framework, ad esempio Monitor. Per la maggior parte dei casi in cui è richiesta la rotazione in attesa, tuttavia, il SpinWait tipo deve essere preferito rispetto al Thread.SpinWait metodo .

Proprietà

Count

Ottiene il numero di chiamate di SpinOnce() su questa istanza.

NextSpinWillYield

Ottiene un valore che indica se la chiamata successiva a SpinOnce() comporterà la cessione del processore, attivando un cambio imposto di contesto.

Metodi

Reset()

Reimposta il contatore delle rotazioni.

SpinOnce()

Esegue una sola rotazione.

SpinOnce(Int32)

Esegue un solo spin e chiama Sleep(Int32) dopo un numero spin minimo.

SpinUntil(Func<Boolean>)

Esegue rotazioni finché non è stata soddisfatta la condizione specificata.

SpinUntil(Func<Boolean>, Int32)

Esegue rotazioni finché non è stata soddisfatta la condizione specificata o fino allo scadere del timeout specificato.

SpinUntil(Func<Boolean>, TimeSpan)

Esegue rotazioni finché non è stata soddisfatta la condizione specificata o fino allo scadere del timeout specificato.

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Thread safety

Sebbene SpinWait sia progettato per essere usato nelle applicazioni simultanee, non è progettato per essere usato da più thread contemporaneamente. SpinWait i membri non sono thread-safe. Se è necessario ruotare più thread, ognuno deve usare la propria istanza di SpinWait.

Vedi anche