다음을 통해 공유


SpinWait.Reset 메서드

정의

회전 수를 다시 설정합니다.

public:
 void Reset();
public void Reset ();
member this.Reset : unit -> unit
Public Sub Reset ()

예제

다음은 간단한 잠금 해제 스택 구현에서 SpinWait을 사용 하는 예제입니다. (이것이 예로 든 것일 뿐입니다. 효율적이 고 스레드로부터 안전한 스택에 필요한 경우 ConcurrentStack를 사용 하는 것이 좋습니다.)

using System;
using System.Threading;

public class LockFreeStack<T>
{
    private volatile Node m_head;
    private class Node { public Node Next; public T Value; }
    public void Push(T item)
    {
        var spin = new SpinWait();
        Node node = new Node { Value = item }, head;
        while (true)
        {
            head = m_head;
            node.Next = head;
            if (Interlocked.CompareExchange(ref m_head, node, head) == head) break;
            spin.SpinOnce();
        }
    }
    public bool TryPop(out T result)
    {
        result = default(T);
        var spin = new SpinWait();
        Node head;
        while (true)
        {
            head = m_head;
            if (head == null) return false;
            if (Interlocked.CompareExchange(ref m_head, head.Next, head) == head)
            {
                result = head.Value;
                return true;
            }
            spin.SpinOnce();
        }
    }
}
Imports System.Threading

Public Class LockFreeStack(Of T)
    Private m_head As Node
    Private Class Node
        Public [Next] As Node
        Public Value As T
    End Class
    Public Sub Push(ByVal item As T)
        Dim spin As New SpinWait()
        Dim head As Node, node As New Node With {.Value = item}
        While True
            Thread.MemoryBarrier()
            head = m_head
            node.Next = head
            If Interlocked.CompareExchange(m_head, node, head) Is head Then Exit While
            spin.SpinOnce()
        End While
    End Sub
    Public Function TryPop(ByRef result As T) As Boolean
        result = CType(Nothing, T)
        Dim spin As New SpinWait()
        Dim head As Node
        While True
            Thread.MemoryBarrier()
            head = m_head
            If head Is Nothing Then Return False
            If Interlocked.CompareExchange(m_head, head.Next, head) Is head Then
                result = head.Value
                Return True
            End If
            spin.SpinOnce()
        End While
    End Function
End Class

설명

따라서 SpinOnce 하 고 NextSpinWillYield 동작에 대 한 호출 처럼 SpinOnce 이 인스턴스에서 실행 해야 합니다. 경우는 SpinWait 인스턴스를 여러 번 다시 사용, 너무 빨리 생성을 방지 하기 위해를 다시 설정 하려면 유용할 수 있습니다.

적용 대상

추가 정보