Gewährleistet C ++ 11 die Speicherreihenfolge zwischen einem Freigabezaun und einer Consume-Operation?

9

Betrachten Sie den folgenden Code:

%Vor%

Macht C ++ irgendwelche Garantien über die Interaktion des Zauns in Thread a mit der konsumierenden Operation in Thread b?

Ich weiß, dass ich in diesem Beispielfall den Fence + Atomspeicher durch einen Store-Release ersetzen kann und es funktionieren lässt. Aber meine Frage bezieht sich auf diesen speziellen Fall mit dem Zaun.

Lesen des Standardtextes Ich kann Klauseln über die Interaktion eines Freisetzungszauns mit einem Acquire-Fence und eines Freisetzungszauns mit einer Acquire-Operation finden, aber nichts über die Interaktion zwischen einem Freisetzungszaun und einer Consume-Operation.

>

Wenn wir den Verbrauch durch ein Acquire ersetzen, würde das den Code normenkonform machen, denke ich. Aber soweit ich die von Prozessoren implementierten Speicherordnungseinschränkungen verstehe, sollte ich eigentlich nur die schwächere 'konsumieren' - Anordnung in Thread b verlangen, da die Speicherbarriere alle Speicher in Thread a vor dem Speicher zum Zeiger hin sichtbar macht, und Das Lesen der Payload ist abhängig vom Lesen vom Zeiger.

Stimmt der Standard?

    
Edmund Kapusniak 20.06.2015, 07:57
quelle

1 Antwort

1

Ihr Code funktioniert.

  

Ich weiß, dass ich in diesem Beispielfall den Fence + Atomspeicher durch einen Store-Release ersetzen kann und es funktioniert. Aber meine Frage bezieht sich auf diesen speziellen Fall mit dem Zaun.

Zaun mit entspannter atomarer Operation ist stärker als entsprechende atomare Operation. Z.B. (aus Ссылка , Notizen):

  

Während ein atomic store-release-Vorgang verhindert, dass alle vorhergehenden Schreibvorgänge an der Freigabe des Speichers vorbeigehen, verhindert eine Anordnung atomic_thread_fence mit memory_order_release , dass alle vorhergehenden Schreibvorgänge über alle nachfolgenden Schreibvorgänge hinausgehen speichert.

    
Tsyvarev 20.06.2015 09:46
quelle