3 Stimmen

Wie kann man atomares 64b-Lesen auf x86 (Pentium und höher) durchführen?

Ich möchte ein atomares Lesen von 64b ausgerichteten 64b-Daten auf einer x86-Plattform (Pentium oder höher garantiert) durchführen.

Gibt es eine Möglichkeit, dies zu tun? (Und nein, ich möchte nicht einen kritischen Abschnitt oder eine Mutex dafür verwenden, ich möchte, dass dies sperrfrei ist).

6voto

Zifre Punkte 25764

Diese Seite beschreibt, wie man es macht. Im Grunde müssen Sie nur Folgendes verwenden lock cmpxchg8b .

4voto

Michael Punkte 52790

Verwenden Sie die verschränkten Operationen, hier ein Beispielcode:

LONGLONG AtomicRead(LONGLONG* p)
{
    return InterlockedCompareExchange64(p, 0, 0);
}

Dies führt den Vergleich gegen Null durch und setzt p auf Null, wenn es bereits gleich Null ist, d.h. es ist ein Noop. InterlockedCompareExchange gibt den ursprünglichen 64-Bit-Wert zurück, auf den p verweist.

0voto

Verwenden Sie die Funktionen Interlocked*().

Es gibt kein Lesen an sich - aber Sie können eine Add()-Funktion ausführen, bei der Sie 0 hinzufügen.

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