Frage

Ich habe einige wiederholte Code (genaue Methoden) gesehen, in denen sie in den kritischen Abschnitt eintreten und dann InterlockedExchange verwenden ... Ist dies sinnvoll, da ich dachte, dass diese Operation atomar ist und keine solche Synchronisation erfordern würde?

{ 
  EnterCricSectionLock lock (somelock);
  InterlockedExchange(&somelong, static_cast<long>(newlongVal));
}

Das ist im Grunde das, was es gibt ...

War es hilfreich?

Lösung

Ein normaler Austausch ist im Allgemeinen nicht atomar. Es ist jedoch in Ordnung, es beim Besitz eines Mutex zu tun, wenn alle anderen Verwendungen durch denselben Mutex geschützt sind. Es ist auch in Ordnung, einen Atomaustausch zu verwenden, wenn alle anderen Verwendungen atomar sind. Der einzige logische Grund, an den ich mir vorstellen kann, einen Atomaustausch während des Besitzes des Mutex durchzuführen, ist, dass nicht alle Verwendungen dieses Wertes mustex geschützt sind.

Andere Tipps

Eine einzelne Atomoperation benötigt kein CS, aber es kann als Zaun dienen, um etwas verändert zu machen, während das Schloss global sichtbar ist (IIRC, explizite Zäune sind für SSE2+, aber unverstockte OPs benötigen überhaupt keine SSE). Dann müsste es jedoch sein nach Alle globalen Geschäfte.

Wenn dies sinnvoll ist, ist das CS verwendet, um den Zugang zu etwas anderem zu sperren, und daher ist der globale Austausch nicht Teil des Schlosses.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top