SpinWait Yapı
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Döndürme tabanlı bekleme için destek sağlar.
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
- Devralma
Örnekler
Aşağıdaki örnekte, nasıl kullanılacağı gösterilmektedir 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
Açıklamalar
SpinWait yaygın dönen mantığı kapsüller. Tek işlemcili makinelerde verimler her zaman meşgul beklemeler yerine kullanılır ve Hyper-Threading teknolojisini kullanan Intel işlemcileri olan bilgisayarlarda donanım iş parçacığının aç kalmasını önlemeye yardımcı olur. SpinWait, iyi bir dönen ve gerçek verim karışımını kapsüller.
SpinWait bir değer türüdür; bu da düşük düzeyli kodun gereksiz ayırma ek yüklerinden korkmadan SpinWait'i kullanabileceği anlamına gelir. SpinWait genellikle sıradan uygulamalar için kullanışlı değildir. Çoğu durumda, gibi .NET Framework Monitortarafından sağlanan eşitleme sınıflarını kullanmanız gerekir. Ancak, döndürme beklemenin gerekli olduğu çoğu amaç için, SpinWait türü yöntemi yerine Thread.SpinWait tercih edilmelidir.
Özellikler
Count |
Bu örnekte kaç kez SpinOnce() çağrıldığını alır. |
NextSpinWillYield |
Bir sonraki çağrısının SpinOnce() işlemciyi verip vermediğini alır ve zorlamalı bağlam anahtarını tetikler. |
Yöntemler
Reset() |
Döndürme sayacını sıfırlar. |
SpinOnce() |
Tek bir döndürme gerçekleştirir. |
SpinOnce(Int32) |
Tek bir döndürme gerçekleştirir ve minimum döndürme sayısının ardından çağrı Sleep(Int32) yapar. |
SpinUntil(Func<Boolean>) |
Belirtilen koşul karşılanana kadar döner. |
SpinUntil(Func<Boolean>, Int32) |
Belirtilen koşul karşılanana kadar veya belirtilen zaman aşımı süresi dolana kadar döner. |
SpinUntil(Func<Boolean>, TimeSpan) |
Belirtilen koşul karşılanana kadar veya belirtilen zaman aşımı süresi dolana kadar döner. |
Şunlara uygulanır
İş Parçacığı Güvenliği
eşzamanlı uygulamalarda kullanılmak üzere tasarlanmış olsa SpinWait da, aynı anda birden çok iş parçacığından kullanılmak üzere tasarlanmamıştır. SpinWait üyeler iş parçacığı açısından güvenli değildir. Birden çok iş parçacığının dönmesi gerekiyorsa, her biri kendi örneğini SpinWaitkullanmalıdır.