Concurrent C ++ 11 - Welche Toolchains können verwendet werden?

8

Ich verwende <thread> <atomic> <mutex> etc stark in meinem Code, der mehrere Lock-Free-Algorithmen enthält. Ich ziele (schließlich) auf eine Linux-Umgebung. Ich habe mit der Beta von Visual Studio 2011 entwickelt, die, obwohl sie fürchterlich in anderen C ++ 11-Funktionen fehlt, die einzige Toolchain zu sein scheint, die die parallelen Funktionen implementiert.

Siehe c ++ 11 Unterstützung hier:

Wenn nun die anderen einfach keine Bibliothek mit den C ++ 11-Begleitfunktionen haben, kann ich einfach just :: thread verwenden. Jedoch antworten sowohl clang als auch gcc "nein" auf das C ++ 11-Speichermodell, was zumindest Visual C ++ zu unterstützen scheint. Ich bin mir nicht ganz sicher, was die Wirkung davon wäre - wahrscheinlich weg von scheinbar nebenwirkungsfreiem Code unter anderen fehlerhaften Dingen zu optimieren.

Wenn ich jetzt vollständig optimierte Builds vermeide und nur Debug-Builds kompiliere, ohne dass Optimierungen aktiviert sind - ist es sinnvoll, die Clang- oder GCC-Toolchain zu verwenden?

    
Eloff 07.04.2012, 15:41
quelle

2 Antworten

4
  

GCC 4.7-Status

     

Die C ++ - Speichermodell-Arbeit ist noch nicht abgeschlossen und soll in Kürze fertiggestellt werden   nächste GCC-Veröffentlichung. GCC 4.7 wurde jetzt veröffentlicht, also ist das was du   kann davon erwarten.

     
  • Vollständige atomare Implementierung für unterstützte lockfreie Anweisungen. Alle atomaren Operationen wurden mit dem neuen __atomic implementiert   Buildins, und die meisten Ziele spiegeln den Speichermodellparameter in der   Code, der generiert wird. Optimierungen verschieben den gemeinsamen Speicher nicht   Operationen vorbei an atomaren Operationen, so dass die verschiedenen passiert   Beziehungen werden geehrt.
  •   
  • Wenn sperrfreie Anweisungen nicht verfügbar sind (entweder über die Hardware- oder Betriebssystemunterstützung), bleiben atomare Operationen als Funktionsaufrufe übrig   von einer Bibliothek gelöst werden. Aufgrund von Zeitbeschränkungen und einer API, die   ist noch nicht abgeschlossen, es gibt keine libatomic mit GCC 4.7. Das ist   leicht durch unbefriedigte externe Symbole festgestellt werden   beginnend mit _ atomar *.
  •   
  • Sollte ein Programm Bibliothekshilfe benötigen, steht eine einzige C - Datei - Beispielimplementierung zur Verfügung, die kompiliert und mit der Datenbank verknüpft werden kann   Client-Programm, um diese externen Funktionsaufrufe mit einem locked aufzulösen   Implementierung. Laden Sie das Beispiel libatomic
  • herunter   
  • C ++ - Vorlagen unterstützen Objekte beliebiger Größe vollständig, obwohl die zuvor erwähnte Datei libatomic.c möglicherweise einige Anforderungen erfüllen muss   benutzerdefinierte Klassen. Wenn eine Klasse der gleichen Größe zugeordnet ist wie eine unterstützte   Lock-Free-Integral-Typ, dann werden auch Lock-Free-Routinen verwendet.
  •   
  • Bitfelder sind nicht mit dem Speichermodell kompatibel. Das heißt, dass sie Datenrennen aufgrund des ganzen Wortes laden oder speichern können   Zugriff beim Lesen oder Schreiben.
  •   
  • Die Optimierungen wurden noch nicht vollständig auf Einhaltung überprüft, obwohl einige Arbeiten bereits durchgeführt wurden. Einige Optimierungen können neue Daten enthalten   Rassen, die vorher nicht anwesend waren. Die Anzahl der bekannten Fälle ist   klein, und das Testen auf die Einhaltung ist nicht trivial. Wenn jemand trifft   Wenn eine Optimierung ein neues Datenrennen einführt, öffnen Sie bitte ein   Bugzilla-Fall dafür, damit es angesprochen werden kann.
  •   

Unterstützung in LLVM scheint weiter zu sein: Ссылка

Es ist schwer zu sagen, in welchem ​​Maße dies tatsächlich beim Klirren verwendet wird. Es scheint, dass <atomic> grundsätzlich für einige Typen funktioniert. Ich erhalte Compiler-Assertionen für andere Typen, die sagen, dass der atomare Typ unerwartet ist, was ein gewisses Vertrauen in die Typen gibt, mit denen er arbeitet.

    
bames53 08.04.2012 09:05
quelle
1

Ich habe gcc-4.7 auf 64-Bit-Linux und Windows mit Erfolg verwendet. std::thread usw. funktioniert auch mit gcc-4.6 perfekt auf Linux.
Unter Windows hat gcc-4.7 (mingw64) einige kleinere Probleme, Speicherlecks mit Destruktoren von std::condition_variable AFAIR.

    
hirschhornsalz 07.04.2012 18:36
quelle