Ich habe eine Struktur, die ein atomares Feld enthält:
%Vor% Diese Struktur ist mit calloc
:
Ist es tragbar zu erwarten, dass p->a
auf 0 initialisiert wird? Es gibt genügend Barrieren im Code, so dass eine schwach konsistente Initialisierung in Ordnung ist, aber ist der Anfangswert garantiert 0?
Nein, das ist im Allgemeinen nicht tragbar. calloc
garantiert nur einen byteweisen 0
-Wert des zugrunde liegenden Objekts. Für Typen, die einen Zustand haben (können), ist dies nicht gleichbedeutend mit einer Initialisierung. Sie müssen definitiv atomic_init
verwenden, um Ihr Objekt in einen gültigen Zustand zu versetzen.
Der Grund dafür sind Plattformen, die zusätzlich zum Basisobjekt eine "Sperre" enthalten, da sie die entsprechende Assembler-Anweisung nicht implementieren. Um portierbar zu sein, müssen Sie wirklich ATOMIC_VAR_INIT
oder atomic_init
für alle atomaren Objekte verwenden, die nicht statisch zugewiesen sind.
Das heißt, ich kenne keine existierende Plattform, die für atomic_int
einen solchen Crust benötigen würde. Wenn für Ihre Plattform ATOMIC_INT_LOCK_FREE
auf 2
und sizeof(atomic_int)==sizeof(int)
festgelegt ist, können Sie relativ sicher sein, dass Ihre Strategie funktioniert. Sie könnten das in _Static_assert
testen.
Meine Vermutung ist, dass dies nicht tragbar / sicher ist.
Es ist sehr wahrscheinlich, dass calloc()
einen einfachen memset()
im Speicherbereich ausführt. Dieses einfache memset()
würde nicht die erforderlichen Speicherbarrieren ausgeben, um sicherzustellen, dass andere Threads, die die Struktur lesen, p->a
als 0
sehen.
Die Initialisierung auf Null wird berücksichtigt, bevor p
oder einer ihrer Teilnehmer auf den Speicher zugreifen kann. Es ist 0
.
Siehe auch aufgeschobene Nullstellung.