C11 statomic und Calloc

9

Ich habe eine Struktur, die ein atomares Feld enthält:

%Vor%

Diese Struktur ist mit calloc :

belegt %Vor%

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?

    
jch 29.05.2015, 17:04
quelle

3 Antworten

3

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.

    
Jens Gustedt 30.05.2015, 14:33
quelle
0

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.

    
Xaqq 29.05.2015 17:14
quelle
-1
%Vor%

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.

    
chux 29.05.2015 18:15
quelle

Tags und Links