Sequenzielle Konsistenz

01/03/2014 - 18:30 von Rainer Grimm | Report spam
Hallo zusammen,
ich experimentiere gerade mit dem Memory-Modell.

Hier mein kleines Programm.

#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> x, y;

void writing(){
x.store(2000);
y.store(11);
}

void reading(){
std::cout << x.load() << std::endl;
std::cout << y.load() << std::endl;
}

int main(){

std::thread thread1(writing);
std::thread thread2(reading);

thread1.join();
thread2.join();

};

Nun erhalte ich ab und zu das Ergebnis:
0
11

Das verwirrt mich maximal, das dies der sequenziellen Konsistenz widerspricht.
Da ich kein Memory Modell explizit angebe, sind mein Variablenzugriff auf x
und y sequenziell konsistent. Das heißt insbesondere, das x vor y in der
Funktion writing ausgeführt werden muss. Damit sind die folgenden Ausgaben
möglich:

0
0

2000
0

2000
11

Aber nicht

0
11

Sowohl mit dem gcc 4.7 als auch mit dem gcc 4.9 erhalte ich aber dieses Ergebnis.

Gruß,
Rainer
 

Lesen sie die antworten

#1 Rainer Grimm
02/03/2014 - 11:17 | Warnen spam
Hallo,
da beantworte ich meine Anfrage doch gleich selber.
Damit sind die folgenden Ausgaben

möglich:



0

0



2000

0



2000

11



Aber nicht



0

11



Eine Befehlsreihenfolge der Form:

std::cout << x.load() << std::endl;
x.store(2000);
y.store(11);
std::cout << y.load() << std::endl;

ergibt natürlich die Ausgabe:
0
11

Vor lauter sequenzieller Konsistenz habe ich das verschrànkte Ausführen der Threads übersehen.

Gruß,
Rainer

Ähnliche fragen