Nachfolgend finden Sie eine Implementierung einer ineinandergreifenden Methode, die auf basiert Interlocked.CompareExchange
.
Ist es ratsam, dass dieser Code SpinWait
vor dem Wiederholen einen Spin verwendet?
public static bool AddIfLessThan(ref int location, int value, int comparison)
{
int currentValue;
do
{
currentValue = location; // Read the current value
if (currentValue >= comparison) return false; // If "less than comparison" is NOT satisfied, return false
}
// Set to currentValue+value, iff still on currentValue; reiterate if not assigned
while (Interlocked.CompareExchange(ref location, currentValue + value, currentValue) != currentValue);
return true; // Assigned, so return true
}
Ich habe SpinWait
in diesem Szenario verwendet gesehen, aber meine Theorie ist, dass es unnötig sein sollte. Immerhin enthält die Schleife nur eine Handvoll Anweisungen, und es gibt immer einen Thread, der Fortschritte macht.
Angenommen, zwei Threads rennen um diese Methode, und der erste Thread ist sofort erfolgreich, während der zweite Thread zunächst keine Änderung vornimmt und wiederholt werden muss. Ist es ohne andere Konkurrenten überhaupt möglich, dass der zweite Thread beim zweiten Versuch fehlschlägt ?
Wenn der zweite Thread des Beispiels beim zweiten Versuch nicht fehlschlagen kann, was können wir dann mit einem gewinnen SpinWait
? In dem unwahrscheinlichen Fall, dass hundert Fäden um die Durchführung der Methode rennen, einige Zyklen abschneiden?
SpinOnce
, um zu verhindern, dass ein Single-Thread-Betriebssystem möglicherweise ausgehungert wird. Siehe stackoverflow.com/questions/37799381/…
Interlocked
. Zur Verdeutlichung interessiert mich nur, ob a SpinWait
sinnvoll ist oder nicht , um beispielsweise CPU-Zyklen sinnvoll zu speichern oder (danke @MatthewWatson!) Zu verhindern, dass ein Single-Thread-Betriebssystem ausgehungert wird.
SpinWait
nicht einmal den Stromverbrauch senkt, da ohnehin die gleiche Anzahl von Versuchen durchgeführt wird! (Mit zwei Threads ist das ein Versuch für den ersten und zwei für den zweiten Thread.)