2 Stimmen

Testen und bedingte Aktualisierung eines Long mit Interlocked

Gibt es eine elegante Möglichkeit, dies mit dem Interlocked Klasse? Oder sollte ich einfach die lock { } ?

Mein spezieller Anwendungsfall ist, dass ich mehrere Threads habe, die eine long Wert und vergleichen ihn mit einem gemeinsamen "Maximum"-Wert, wobei der gemeinsame Wert nur ersetzt wird, wenn der lokale Wert größer ist.

4voto

Jordão Punkte 53117

Versuchen Sie die Interlocked.CompareExchange Methode. Ich habe es nicht ausprobiert, aber etwas in dieser Art scheint logisch zu mir:

long localMax = Interlocked.Read(ref max);
while (value > localMax) {
  Interlocked.CompareExchange(ref max, value, localMax);
  localMax = Interlocked.Read(ref max);
}

Wie üblich sollten Sie Ihren Code einem Belastungstest unterziehen, um Gleichzeitigkeitsprobleme zu erkennen.

0voto

LukeH Punkte 251752

Solange der Wert des gemeinsam genutzten Feldes immer nur ansteigt, können Sie etwas Ähnliches mit einer Kombination aus Read y CompareExchange .

long sharedVal = Interlocked.Read(ref _sharedField);
while (localVal > sharedVal)
{
    long temp = Interlocked.CompareExchange(ref _sharedField, localVal, sharedVal);
    sharedVal = (temp == sharedVal) ? localVal : temp;
}

Ich würde mich jedoch für eine einfache lock in dieser Situation: mit Interlocked ist weniger lesbar als eine lock Blocks und hat auch das Potenzial für eine viel schlechtere Leistung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X