SpinWait Struktur

Definisi

Menyediakan dukungan untuk menunggu berbasis spin.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Warisan
SpinWait

Contoh

Contoh berikut menunjukkan cara menggunakan 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

Keterangan

SpinWait merangkum logika spinning umum. Pada mesin prosesor tunggal, hasil selalu digunakan alih-alih menunggu yang sibuk, dan di komputer dengan prosesor Intel yang menggunakan teknologi Hyper-Threading, ini membantu mencegah kelaparan utas perangkat keras. SpinWait merangkum campuran berputar dan hasil yang benar yang baik.

SpinWait adalah jenis nilai, yang berarti bahwa kode tingkat rendah dapat menggunakan SpinWait tanpa takut overhead alokasi yang tidak perlu. SpinWait umumnya tidak berguna untuk aplikasi biasa. Dalam kebanyakan kasus, Anda harus menggunakan kelas sinkronisasi yang disediakan oleh .NET Framework, seperti Monitor. Untuk sebagian besar tujuan di mana spin menunggu diperlukan, namun, SpinWait jenisnya harus lebih disukai Thread.SpinWait daripada metode .

Properti

Nama Deskripsi
Count

Mendapatkan berapa kali SpinOnce() telah dipanggil pada instans ini.

NextSpinWillYield

Mendapatkan apakah panggilan berikutnya akan SpinOnce() menghasilkan prosesor, memicu pengalihan konteks paksa.

Metode

Nama Deskripsi
Reset()

Mengatur ulang penghitung putar.

SpinOnce()

Melakukan satu putaran.

SpinOnce(Int32)

Melakukan satu putaran Sleep(Int32) dan panggilan setelah jumlah putaran minimum.

SpinUntil(Func<Boolean>, Int32)

Berputar hingga kondisi yang ditentukan terpenuhi atau hingga batas waktu yang ditentukan kedaluwarsa.

SpinUntil(Func<Boolean>, TimeSpan)

Berputar hingga kondisi yang ditentukan terpenuhi atau hingga batas waktu yang ditentukan kedaluwarsa.

SpinUntil(Func<Boolean>)

Berputar hingga kondisi yang ditentukan terpenuhi.

Berlaku untuk

Keamanan Thread

Meskipun SpinWait dirancang untuk digunakan dalam aplikasi bersamaan, ini tidak dirancang untuk digunakan dari beberapa utas secara bersamaan. SpinWait anggota tidak aman untuk utas. Jika beberapa utas harus berputar, masing-masing harus menggunakan instansnya sendiri dari SpinWait.

Lihat juga