Поделиться через


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 Framework, например Monitor. Однако в большинстве случаев, когда требуется ожидание спина SpinWait , тип должен быть предпочтительнее, чем Thread.SpinWait метод .

Свойства

Count

Получает число раз, которое SpinOnce() был вызван для этого экземпляра.

NextSpinWillYield

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

Методы

Reset()

Сбрасывает подсчет прокруток.

SpinOnce()

Выполняет одну прокрутку.

SpinOnce(Int32)

Выполняет один цикл и вызывает Sleep(Int32) после достижения минимального числа циклов.

SpinUntil(Func<Boolean>)

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

SpinUntil(Func<Boolean>, Int32)

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

SpinUntil(Func<Boolean>, TimeSpan)

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

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

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

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

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