2009-04-24 8 views
3

Ich möchte atomare Lesen von 64b ausgerichteten 64b Daten auf x86-Plattform (Pentium oder höher garantiert) durchführen und atomare lesen.Wie atomare 64b lesen auf x86 (Pentium und höher) ausführen?

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

+0

bitte bestätigen - meinst du 64 Bits oder Bytes? – Alnitak

+1

Ich gehe davon aus, dass es 64 Bit ist. Bytes würden keinen Sinn ergeben. – Zifre

+0

Die Frage wäre besser, wenn Windows im Text erwähnt würde und nicht nur das win32-Tag. Ich sehe Tags als Hilfe bei Suchen, nicht als Information an sich. –

Antwort

4

der Sperrungs Operationen verwenden, hier einige Codebeispiel:

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

Dies ist der Austausch gegen Null nicht vergleichen und setzt p auf Null, wenn es auf Null -ie schon gleich ist, ist es ein noop. InterlockedCompareExchange gibt den ursprünglichen 64-Bit-Wert zurück, auf den p verweist.

+0

InterlockedAdd() Hinzufügen von 0 ist besser - CAS hat mehr Arbeit zu tun und verbraucht mehr Zyklen. –

+1

Laut MSDN InterlockedAdd wird nur auf Itanium unterstützt. Sogar auf x86 ist Sperren hinzufügen nur ein 32-Bit-Lesevorgang. – Michael

+0

Ich meine, InterlockedAdd64. – Michael

0

Verwenden Sie die Funktionen Interlocked *().

Es gibt keine Lese per se - aber Sie können ein Add ausgeben(), wo Sie 0.

+1

Warum vermuten Sie, dass er Windows verwendet? – Zifre

+0

Es gibt keine Interlocked Add, Or/Xor auf x86, nur _InterlockedCompareExchange64 - siehe Antwort von Zifre – Suma

+1

Die Frage wird derzeit als "win32" markiert, also denke ich, es ist sicher anzunehmen, dass die Windows-Funktionen akzeptabel sind. –

6

This page beschreibt hinzufügen, wie es geht. Grundsätzlich müssen Sie nur lock cmpxchg8b verwenden.

+0

C++, nicht asm - er will das Betriebssystem Wrapper zur Verfügung gestellt. –

+1

@Blank Xavier, warum denkst du, er will OS Wrapper zur Verfügung gestellt? Und woher weißt du, welches Betriebssystem er benutzt? – Zifre

+0

C++ - Tag. Ich kenne das Betriebssystem jedoch nicht, daher ist mein Interlocked *() - Vorschlag möglicherweise für ihn nicht nützlich. –