2017-02-27 2 views
1

Ich möchte verstehen, wie Speicherbarrieren in C++ funktioniert. Zum Beispiel verwende ich std :: Atom in diesem Fall:Understanding std :: atomare Speicherbarrieren

#include <iostream> 
#include <atomic> 

int main() 
{ 
    std::atomic<int> a; 
    int n = load();//returns 1 or other value written by other thread 
    a.store (n, std::memory_order_release); 
} 

dass Code über semantisch gleich der Ist Code unten?

#include <iostream> 
#include <atomic> 
int main() 
{ 
    std::atomic<int> a; 
    int n = load(); 
    std::atomic_thread_fence(std::memory_order_release); 
    n = 100;//assume assignment is atomic 
} 

Wenn ich recht habe, kann ich sicher sein, dass das Verhalten für alle C++ Funktionen gleich ist, welche Speicherbarrieren als Argument akzeptieren kann?

+0

Meinst du in der zweiten Zeile der Hauptfunktion, in den zwei Beispielen 'int n = a.load (std :: memory_order_acquire)' und am zweiten Beispiel die vierte Zeile: 'a = 100'? – Oliv

+0

Nein, Ladefunktion ist nicht std :: atomic load function. Das ist eine benutzerimplementierte Funktion, die einige Daten zurückgibt. –

+0

Das Beispiel scheint durcheinander zu sein. Der erste Auszug speichert eindeutig einen Wert in "a". Aber der zweite Auszug bezieht sich überhaupt nicht auf "a", also warum ist er da? –

Antwort

0

Nein, aber es ist äquivalent dazu:

#include <iostream> 
#include <atomic> 
int main() 
{ 
    std::atomic<int> a; 
    int n = load(); 
    std::atomic_thread_fence(std::memory_order_release); 
    a.store (12345, std::memory_order_relaxed); 
    n=100; 
} 

(obwohl der Wert anders als das, was Sie dort taten nach oben). Dort muss ein Atomspeicher innerhalb des Zauns sein. Überprüfen Sie die Bedingungen here unter "Zaun-Zaun-Synchronisation" oder "Zaun-Atom-Synchronisation". Obwohl Sie keine Einschränkungen beim Speichern von a festlegen, wird es innerhalb der memory_order_release, und so wird n. Das ist es, was ein Zaun tut.

+0

Wie ich verstehe, setzen Sie diesen Code a.store (12345, std :: memory_order_relaxed); für atomare Zuweisung bereitstellen. Ich möchte nur die Reihenfolge der Ausführung wissen. Ist Barrierefreiheit am Ort wie in meinem Code? –

+0

@DarkRider Die 'memory_order_release'-Barriere * muss * vor allem sein, was Sie in der richtigen Reihenfolge haben möchten. Auf der anderen Seite muss die Schranke von "memory_order_acquire" nach allem sein, was Sie synchronisieren wollen. Deshalb wird es "Zaun" genannt. Es ist, als würdest du synchronisiertes Zeug in einen Käfig legen, der mit * release * beginnt und mit * acquire * endet. Beantwortet das deine Frage? –

+0

Ich will nur wissen, wenn ich a.store (n, std :: memory_order_release); Ist diese mittlere Barriere vor dem Aufruf aller Operationen innerhalb der Speicherfunktion platziert? Ich kann nicht geeigneten Quellcode finden, um zu sehen, dass –