2017-04-03 7 views
0

glib a bietet g_atomic_int_get Funktion zum atomaren Lesen eines Standards C int Typ. Liest 32-Bit-Ganzzahlen nicht aus dem Speicher in Register, die vom Prozessor nicht bereits als atomare Operation garantiert werden (z. B. mov <reg32>, <mem>)?Welchen Zweck hat glib's g_atomic_int_get?

Wenn ja, was ist der Zweck derFunktion von glib?

+1

'Ist ... nicht schon garantiert eine atomare Operation durch den Prozessor?' Nun, was für ein Prozessor? Ich bin sicher, dass es einige gibt, wo es ist, und einige, wo es nicht ist. – Siguza

+0

Auch Int kann nicht 32 Bit sein, weder das Register. – user3528438

Antwort

5

Einige Prozessoren ermöglichen das Lesen nicht ausgerichteter Daten, aber das kann mehr als einen einzigen Zyklus dauern. I.e. es ist nicht mehr atomar. Bei anderen ist es vielleicht überhaupt keine atomare Operation.

0

Der Befehl x86 mov ist nicht immer atomar: es ist non-atomic if the addresses involved are not naturally aligned.

Auch wenn es immer atomare war, ist es kein memory barrier, was bedeutet, dass der Compiler frei ist, den Befehl mit Bezug auf andere Anweisungen in der Nähe neu zu ordnen; und der Prozessor ist frei, den Befehl mit Bezug auf andere Befehle in dem Befehlsstrom zur Laufzeit neu zu ordnen.

Wenn Sie nicht nur Code für eine einzelne Plattform erstellen (und sicher sind, dass Code niemals auf eine andere Plattform portiert werden muss), müssen Sie immer explizite atomare Anweisungen verwenden, wenn Sie atomare Garantien benötigen.

Verwandte Themen