2012-07-29 8 views
10

Ich sehe C++ 11 Mutexe Sperre ist nicht void lock() volatile. Woher weiß der Compiler, welche Funktionen Speicherbarrieren sind und welche nicht? Sind alle Funktionen Barrieren, auch wenn sie nicht volatil sind? Was sind weniger bekannte Speicherbarrieren und Speicherbarrieren, die jeder kennen sollte?Was sind Beispiele für Speicherbarrieren in C++?

+5

Es hängt wirklich von der Plattform ab. C++ - Compiler für eingebettete Systeme mit nur einem einzigen Kern können Mutexe ohne jegliche Speicherbarriere implementieren, da Speicher immer kohärent ist. –

+1

@BenVoigt, sie müssen die Neuanordnung von Compileranweisungen noch blockieren. –

Antwort

5

Die Laufzeitbibliothek muss einen Mutex implementieren, so dass der Compiler es kennt! Der Sprachstandard sagt nichts darüber aus, wie dies zu tun ist.

Wahrscheinlich beinhaltet es einen Aufruf an einige Betriebssystem-Service, der als eine Speicherbarriere arbeitet. Oder kann der Compiler eine Erweiterung haben, wie void _ReadWriteBarrier();

5

Die tatsächliche Umsetzung Ihrer std::mutex wird so sein, dass der Compiler nicht illegal Umordnung nicht durchführt, nicht elide variablen Lasten, und es wird sichergestellt, dass die Sperrvariable zugegriffen wird atomar und dass die CPU die notwendigen Speicherbarrieren für die Erfassung und Freigabe von Sperren ausführt.

Die Details, wie viel Arbeit getan werden muss, um sicherzustellen, dass dies von Plattform zu Plattform variiert, aber Ihre Bibliothek Implementierung wird das Richtige tun.

+1

Meine Frage ist mehr wie weiß der Compiler was in Mutex und warum nicht neu Variablen vor und nach der Sperre? Die Funktionen sind sicher nicht als flüchtig gekennzeichnet. Auch habe ich einmal MSVC-Header angeschaut und es scheint, dass es keine Vorlage ist und über die lib verlinkt ist. Also ... ich glaube nicht, dass es inlined für den Compiler zu analysieren und zu sehen, ob Vars in * dieser * Funktion benötigt, um nicht neu geordnet werden ... –

+0

@ acidzombie24: Vermutlich wird ein externer Funktionsaufruf nie von der neu geordnet werden Compiler, denn wie Sie beobachten, kann dies niemals bewiesen werden. –

Verwandte Themen