C ++ 11 bietet Funktionen wie Thread-sichere Initialisierung von statischen Variablen und unter Berufung auf diese Frage sagen wir zum Beispiel:
%Vor%So ist das scheinbar (?) unabhängig davon, ob ein Modul, das mit einem C ++ 11-Compiler kompiliert wurde, die Thread-Header enthielt oder irgendwelche Threads in seinem Body erzeugte. Ihnen wird die Garantie angeboten, selbst wenn sie mit einem anderen Modul verknüpft wurde, das C ++ 11-Threads verwendet und die Funktion aufgerufen hat.
Aber was ist, wenn Ihr "anderes Modul", das diesen Code aufruft, nicht C ++ 11-Threads verwendet, sondern etwas wie Qt's QThread
. Ist die atomare Initialisierung der Statik außerhalb der Möglichkeiten von C ++ 11, eine solche Garantie zu geben? Oder bedeutet die bloße Tatsache, dass ein Modul mit C ++ 11 kompiliert und dann mit anderem C ++ 11 Code verknüpft wurde, dass Sie die Garantie trotzdem erhalten?
Weiß jemand eine gute Referenz, wo solche Probleme behandelt werden?
Ihr Beispiel basiert auf dem Speichermodell und nicht darauf, wie Threads implementiert werden. Wer diesen Code ausführt, führt die gleichen Anweisungen aus. Wenn zwei oder mehr Kerne diesen Code ausführen, folgen sie dem Speichermodell.
Die grundlegende Implementierung entspricht dem:
%Vor%Dieser Code kann zur Verwendung des doppelt überprüften Sperrmusters (DCLP) optimiert werden, das bei einer bestimmten Prozessorarchitektur (z. B. auf dem x86) viel schneller sein kann. Da der Compiler diesen Code generiert, weiß er auch nicht, dass er verrückte Optimierungen durchführt, die den naiven DCLP durchbrechen.
Weiß jemand eine gute Referenz, wo solche Probleme behandelt werden?
Sicher. Der C ++ Standard. Es beschreibt das Verhalten von C ++ - Code. Wenn Ihre Bibliothek C ++ - Code ist, müssen Sie dieses Verhalten befolgen. Ja, Sie erhalten die gleichen Garantien, als wäre es Ihr eigener Code.
Genau wie der Compiler / Runtime / OS / alles andere es auszieht ist Nicht Ihr Problem. Der C ++ - Standard garantiert, dass dafür gesorgt ist.
Tags und Links c++ thread-safety c++11 language-lawyer