SpinWait Структура

Определение

Предоставляет поддержку ожидания на основе спина.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Наследование
SpinWait

Примеры

В следующем примере показано, как использовать :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

Комментарии

SpinWait инкапсулирует общую логику спиннинга. На компьютерах с одним процессором доходность всегда используется вместо занятых ожиданий, а на компьютерах с процессорами Intel, используюющими технологию Hyper-Threading, это помогает предотвратить нехватку аппаратного потока. SpinWait инкапсулирует хорошую смесь спиннинга и истинной доходности.

SpinWait — это тип значения, что означает, что код низкого уровня может использовать SpinWait, не опасаясь ненужных затрат на выделение. SpinWait обычно не подходит для обычных приложений. В большинстве случаев следует использовать классы синхронизации, предоставляемые платформой .NET, например Monitor. В большинстве случаев, когда требуется ожидание спина, однако тип SpinWait должен быть предпочтителен для Thread.SpinWait метода.

Свойства

Имя Описание
Count

Возвращает количество вызовов SpinOnce() для этого экземпляра.

NextSpinWillYield

Возвращает, будет ли следующий вызов SpinOnce() давать обработчику, активируя принудительный переключатель контекста.

Методы

Имя Описание
Reset()

Сбрасывает счетчик спина.

SpinOnce()

Выполняет один спин.

SpinUntil(Func<Boolean>, Int32)

Выполняется до тех пор, пока указанное условие не будет выполнено или не истекло указанное время ожидания.

SpinUntil(Func<Boolean>, TimeSpan)

Выполняется до тех пор, пока указанное условие не будет выполнено или не истекло указанное время ожидания.

SpinUntil(Func<Boolean>)

Выполняется до тех пор, пока указанное условие не будет удовлетворено.

Применяется к

Потокобезопасность

Хотя SpinWait он предназначен для использования в параллельных приложениях, он не предназначен для одновременного использования из нескольких потоков. SpinWait элементы не являются потокобезопасными. Если несколько потоков должны открутиться, каждый из них должен использовать свой собственный SpinWaitэкземпляр.

См. также раздел