2016-07-04 13 views
1

Zum BeispielWas bedeutet Zuweisung für eine C11 Atom?

atomic_int test(void) 
{ 
    atomic_int tmp = ATOMIC_VAR_INIT(14); 
    tmp = 47;     // Looks like atomic_store 
    atomic_int mc;    // Probably just uninitialised data 
    memcpy(&mc,&tmp,sizeof(mc)); // Probably equivalent to a copy 
    tmp = mc + 4;    // Arithmetic 
    return tmp;     // A copy - perhaps load then store 
} 

Clang ist mit all dies glücklich. Ich habe Abschnitt 7.17 des Standards gelesen, der viel über das Speichermodell und die definierten Funktionen (init, store, load usw.) sagt, aber nichts über die üblichen Operationen (+, = usw.) sagt.

Von Interesse ist auch das Verhalten von struct wot { atomic_int value; } an Funktionen übergeben.

Ich würde gerne glauben, dass die Zuweisung verhält sich identisch mit einer atomaren Ladung dann mit memory_order_seq_cst speichern.

Noch optimistischer würde ich gerne glauben, dass die Strukturzuweisung, die Übergabe an die Funktion, die Rückkehr von der Funktion und sogar memcpy sich genauso verhält, als würde das Bitmuster sorgfältig unter memory_order_seq_cst kopiert.

Ich kann jedoch keine unterstützenden Beweise für beide Glauben in der Norm finden. Es besteht definitiv die Möglichkeit, dass die Zuweisung und Speicherung von atomaren Primitiven ein undefiniertes Verhalten ist.

Wie sollten sich primitive Operationen auf atomaren Primitiven verhalten?

Danke!

Antwort

3

Operationen an Objekten, die _Atomic qualifiziert sind (und atomic_int ist nur ein anderes Schreiben dafür) sind garantiert sequentielle Konsistenz. Sie finden das am Ende der Semantik für jeden der Operanden. (Und vielleicht die Erwähnung für Zuordnung fehlt.)

Ihr Code ist an zwei Stellen nicht korrekt: Initialisierung muss das ATOMIC_VAR_INIT Makro (7.17.2.1) verwenden, und memcpy ist undefined (die Größen stimmen möglicherweise nicht überein), obwohl es wahrscheinlich wird auf den meisten Architekturen arbeiten.

Auch die Linie

tmp = mc + 4;    // Arithmetic 

nicht tut, was Ihr Kommentar Ansprüche. Dies ist keine Arithmetik für ein atomares Objekt, sondern eine Ladung gefolgt von einer gewöhnlichen Addition. Interessanter wäre

mc += 4;    // Arithmetic 

die eine atomare Operation mit sequenzieller Konsistenz ist.

+0

Danke! Ist memcpy für _Atomic types definiert, wenn die üblichen Einschränkungen für Größe und Ausrichtung erfüllt sind? Das obige Beispiel war memcpy zwischen zwei _Atomic int, die die gleiche Größe wie die anderen haben werden, aber ich bin auch anfällig für Memcpy zu und von ausgerichteten Char-Arrays als eine Verkapselungstechnik, die ich traurig sein würde für _Atomic Felder aufgeben innerhalb einer Struktur. –

+0

Nein, der Zugriff auf '_Atomic' ist nur gültig, wenn er die Operatoren oder Funktionen durchläuft. Wenn Sie 'memcpy' machen, kann keine Garantie für die Atomarität gegeben werden. –

+0

Danke. Ich denke, ich kann damit arbeiten. –