Torsten Werner schrieb voriges Jahr:
#define barrier() __asm__ __volatile__("": : :"memory")
Kennzeichnung: [1][2][3] [4]
Meines Wissens soll damit Speicher- und Registerinhalt irgendwie synchronisiert werden. Weiss jemand, wozu das gut ist?
Ein bisschen mehr Beachtung des Kontexts hilft hier weiter, oberhalb dieser Zeile steht:
/* Optimization barrier */ /* The "volatile" is due to gcc bugs */
Es geht hier darum, dass der gcc das Programm so schreibt, dass alle Speicherzugriffe vor barrier() vor allen nach barrier() im Maschinencode stehen und alle Variablen, die laut C-Code im Hauptspeicher stehen koennten, dort auch wirklich hinkommen und hinterher auch wieder von dort gelesen werden. Ohne barrier() steht es dem C-Compiler frei, alle Werte auch in Register abzulegen und dort auch darauf zuzugreifen.
Was Prozessor und Cache dann mit den Daten machen, ist deren Problem, die Bits koennen also ohne weiteres in irgendwelchen Cache-Lines oder Pipelines herumlungern, solange das Ergebnis der Befehlssequenz _vom Prozessor aus gesehen_ nicht veraendert wird.
Erklaerung der Parameter zu __asm__: Die einzelnen Teile werden durch ':' getrennt. Teil [1] ist der Text, der (fast) unveraendert in die temporaer erzeugte .s-Datei kommt, in unserem Fall kommt dort nichts zusaetzlich rein. [2] sind output-Parameter des asm-Statements, hier keine. [3] sind die input-Parameter, wieder gibt es keine. Unter [4] wird beschrieben, was sich aendert, ohne dass es als in-/output-Parameter angegeben ist, das koennen Prozessorregister oder eben "memory" - der Hauptspeicher sein. Noch mehr Details stehen in der Doku zum gcc.
Gesundes Neues Jahrtausend!
Holger