SpinWait Структура

Определение

Предоставляет поддержку ожидания на основе прокруток.Provides support for spin-based waiting.

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

Примеры

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

Комментарии

SpinWait инкапсулирует общую логику цикличности.SpinWait encapsulates common spinning logic. На компьютерах с одним процессором выпуски всегда используются вместо ожиданий занятости, а на компьютерах с процессорами Intel, использующими технологию Hyper-Threading, это помогает предотвратить нехватку аппаратных потоков.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 инкапсулирует хорошее сочетание цикличности и возвращает значение true.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWait является типом значения. Это означает, что код низкого уровня может использовать SpinWait, не опасаясь ненужных переголовков.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait обычно не используется для обычных приложений.SpinWait is not generally useful for ordinary applications. В большинстве случаев следует использовать классы синхронизации, предоставляемые .NET Framework, например Monitor.In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. Однако для большинства целей, где требуется ожидание, тип SpinWait должен быть предпочтительнее метода Thread.SpinWait.For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Свойства

Count

Получает число раз, которое SpinOnce() был вызван для этого экземпляра.Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield

Получает значение, показывающее, даст ли следующий вызов к SpinOnce() доступ к процессору, запуская обязательное переключение контекста.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Методы

Reset()

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

SpinOnce()

Выполняет одну прокрутку.Performs a single spin.

SpinOnce(Int32)

Выполняет один цикл и вызывает Sleep(Int32) после достижения минимального числа циклов.Performs a single spin and calls Sleep(Int32) after a minimum spin count.

SpinUntil(Func<Boolean>)

Выполняет прокрутки до удовлетворения заданного условия.Spins until the specified condition is satisfied.

SpinUntil(Func<Boolean>, Int32)

Выполняет прокрутки до удовлетворения заданного условия или истечения заданного времени ожидания.Spins until the specified condition is satisfied or until the specified timeout is expired.

SpinUntil(Func<Boolean>, TimeSpan)

Выполняет прокрутки до удовлетворения заданного условия или истечения заданного времени ожидания.Spins until the specified condition is satisfied or until the specified timeout is expired.

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

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

Хотя SpinWait предназначено для использования в параллельных приложениях, оно не предназначено для одновременного использования из нескольких потоков.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. члены SpinWait не являются потокобезопасными.SpinWait members are not thread-safe. Если несколько потоков должны вращаться, каждый из них должен использовать собственный экземпляр SpinWait.If multiple threads must spin, each should use its own instance of SpinWait.

Дополнительно