Ich kann die Implementierung von AtomicCmpExchange
nicht finden (scheint versteckt zu sein), also weiß ich nicht, was es tut.Ist AtomicCmpExchange auf allen Plattformen zuverlässig?
Ist AtomicCmpExchange
zuverlässig auf allen Plattformen? Wie wird es intern umgesetzt? Benutzt es so etwas wie einen kritischen Abschnitt?
Ich habe dieses Szenario:
Mainthread:
Target := 1;
Thread1:
x := AtomicCmpExchange(Target, 0, 0);
Thread2:
Target := 2;
Thread3:
Target := 3;
Wird x
immer eine ganze Zahl 1, 2 oder 3 sein, oder könnte es etwas anderes sein? Ich meine, selbst wenn die AtomicCmpExchange(Target, 0, 0)
fehlgeschlagen, den Wert zu tauschen, gibt es eine "gültige" Ganzzahl (ich meine, nicht eine halbe gelesene Integer, zum Beispiel wenn ein anderer Thread bereits begonnen hat, den Wert halb zu schreiben)?
Ich möchte vermeiden, einen kritischen Abschnitt zu verwenden, ich brauche maximale Geschwindigkeit.
Ja, es wird immer eine gültige Ganzzahl zurückgegeben. Wenn der Wert des Ziels mit dem Comparand übereinstimmt, wird der Wert getauscht und der Rückgabewert ist der vorherige Wert des Ziels. Wenn das Ziel nicht übereinstimmt, wird der Wert zurückgegeben. All dies geschieht atomar, was bedeutet, dass es ohne die Sorge, dass Zwischenzustände es vermasseln, abgeschlossen wird. –
Es ist auch erwähnenswert, dass die Variablen ausgerichtet werden müssen –
Microsoft sagt, dass die Ausrichtung erforderlich ist (für x86 und x64), aber Intel scheint nicht zu stimmen: http://StackOverflow.com/Questions/1415256/AusrichtungsAnforderungen-für-atomare -x86-Anweisungen – Alexandre