Frage

Ich möchte wissen, ob ich an gesetzten Bits innerhalb eines char / integer von mehreren Threads versuchen, werde ich jede Änderung verlieren? Ich werde alle Nullen am Anfang und die Fäden werden es nur auf 1 gesetzt. Die Systemarchitektur ist x64.

Danke, Gokul.

War es hilfreich?

Lösung

Auf x64 (und x86) Operationen auf ints sind atomar. Dies bedeutet, dass Lese- und Schreibvorgänge unabhängig voneinander atomar, nicht in Kombination. (Z Wenn Sie zwei Threads einen int zur gleichen Zeit schreiben, werden Sie nicht die Hälfte einer und eine Hälfte der anderen sehen -. Sie werden immer eine volle int oder die andere sehen)

Allerdings Lesen und Schreiben sind zwei getrennte Vorgänge. Sie können einige Operationen durchführen verzahnt (wodurch die Lese- und Schreib eine atomare Operation sein), aber ich glaube nicht, dass bitweise Logik in die Reihe von Operationen fällt, der auf diese Weise durchgeführt werden kann.

Ich denke, Sie werden auf einige Mutex / Monitor sperren haben und die Lese- / Schreib ausführen, wenn Sie diese Operation wollen atomar sein.

Andere Tipps

Sie müssen entweder einen Mutex oder ähnlichen Synchronisationsmechanismus oder eine atomare Operation verwenden. Für die ersteren gibt es POSIX und Windows-Bibliotheken leicht verfügbar und sehr Standard. Für die letzteren werden die meisten Compiler einige Funktionen zur Verfügung stellen (zB http://gcc.gnu.org/wiki/Atomic ), Inline-Assembler-Modus oder andere bequeme Art und Weise zu verwenden, um sie, und Sie können immer zurückgreifen auf ein Objekt Verknüpfung von Assembler-Sprache erstellt werden.

Sie können auf jeden Fall nicht so explizite Synchronisation vermeiden. Auch wenn etwa XOR irgendwie direkt und atomar auf dem Wert in der CPU-Kern innersten Cache-Speichers betrieben (die es nicht), Sie garantieren müssen, dass Wert mit anderem CPU-Kern des Caches synchronisiert wird. Nur die CPU-Befehle, die explizit Sync-Caches für Sie nützlich sind - es ist am einfachsten, sie durch eine der Bibliothek Optionen verwenden oben genannten

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