Der neue C11-Standard bietet Unterstützung für Multithreading.
Meine Fragen sind etwas abwechslungsreich, aber definitiv zu beantworten.
Ich habe mir den Entwurf für C11 n1570 angesehen .
Es sagt:
Unterstützung für mehrere Ausführungsthreads, einschließlich eines verbesserten Speichersequenzierungsmodells, atomarer Objekte und threadlokaler Speicher (
<stdatomic.h>
und<threads.h>
)
Was ist das verbesserte Speichersequenzierungsmodell ? Wie / Was ändert sich gegenüber dem c99 Standard?
Anstatt nur Zitate aus dem Standard zu zitieren, würde ich es begrüßen, wenn sich jemand eingehender mit ihnen befasst und versucht, die Semantik zu erklären.
Soweit ich weiß, bietet C11 Unterstützung für:
- Thread-Erstellung und -Verwaltung
- Mutex
- Bedingte Variablen
- Thread-spezifischer Speicher &
- Atomobjekte
Ich hoffe ich habe nichts verpasst?
Da die Standardbibliothek selbst jetzt alle für Multi-Threading erforderlichen Funktionen bereitstellt (bereitstellt), wären POSIX und solche Bibliotheken (für Multi-Threading-Unterstützung) in Zukunft nicht mehr erforderlich.
Welche Compiler unterstützen die oben genannten Funktionen? Gibt es Hinweise auf Zeitpläne, wann diese unterstützt werden?
Ich erinnere mich, dass es für C ++ 11 einen Link für Compiler-Unterstützung und -Funktionen gab, vielleicht so etwas?
quelle
1-3
Qs sind logisch verwandt und sollten zusammengefasst werden. Eine Antwort für eine der 3 würde alle 3 berühren. Vielleicht4
könnte es sich um ein separates Q handeln, aber ich fühlte mich nicht berechtigt, ein Q nur dafür zu beginnen .Antworten:
Schreiben Sie C ++ 11 zunächst nicht ab. Die Parallelitätsarbeit für die neuen Standards wurde unter dem Dach von C ++ 11 durchgeführt und dann mit dem ausdrücklichen Ziel, kompatibel zu sein, in C11 importiert. Obwohl es einige syntaktische Unterschiede gibt (z. B. weil C einfach keine Vorlagen oder Funktionsüberladung aufweist), sind sie semantisch vom Design her identisch. Für "Beweise" dafür kann man die WG14-Papiere überprüfen. Z.B:
und Referenzen darin. Weitere finden Sie auf der Open Std Website
Nun zu Ihren Fragen:
Was ist das verbesserte Speichersequenzierungsmodell?
Die offensichtliche Antwort ist, dass es geändert wurde, um mehrere Threads und deren Interaktion zu berücksichtigen. Eine etwas längere Antwort finden Sie in C ++ 11, in dem ein standardisiertes Speichermodell eingeführt wurde. Was bedeutet das? Und wie wird sich das auf die C ++ - Programmierung auswirken? das wurde schon in den Kommentaren erwähnt. Für ein gründliches Verständnis ist eine Stackoverflow-Antwort möglicherweise nicht der richtige Ort (noch weniger eine Frage mit mehreren Unterfragen!). Glücklicherweise unterhält Hans Boehm eine sehr gute Seite mit interessanten Links zum weiteren Lesen (denken Sie auch hier daran, dass die Speichermodelle C11 und C ++ 11 semantisch identisch sind).
Ich hoffe ich habe nichts verpasst?
Zusammen mit dem Speichermodell scheint Ihre Liste die Parallelitätszusätze in C11 abzudecken. Für andere Änderungen hat Wikipedia eine Liste ; Ich kann mir nichts einfallen lassen, was die Wikipedia-Liste übersehen hat.
Da die Standardbibliothek selbst jetzt alle für Multi-Threading erforderlichen Funktionen bereitstellt (bereitstellt), wären POSIX und solche Bibliotheken (für Multi-Threading-Unterstützung) in Zukunft nicht mehr erforderlich.
Ja, es wird einen Bedarf für sie geben. Erstens wird niemand den gesamten vorhandenen Code neu schreiben, der die verschiedenen vorhandenen Thread-APIs verwendet. Zweitens ist / wird die C (++) 11-Thread-Bibliothek höchstwahrscheinlich als Wrapper um die verschiedenen nativen Thread-Bibliotheken implementiert. Zum Teufel gibt es sogar eine dokumentierte Möglichkeit, einen Zeiger auf den zugrunde liegenden nativen Thread abzurufen, falls etwas getan werden muss, das über das hinausgeht, was die C (++) - Thread-Bibliothek unterstützt. Stellen Sie sich die C (++) 11-Thread-Bibliothek eher wie einen tragbaren Wrapper mit dem kleinsten gemeinsamen Nenner um die verschiedenen nativen Thread-Bibliotheken vor.
Welche Compiler unterstützen die oben genannten Funktionen? Gibt es Hinweise auf Zeitpläne, wann diese unterstützt werden? Ich erinnere mich, dass es für C ++ 11 einen Link für Compiler-Unterstützung und -Funktionen gab, vielleicht so etwas?
Ich habe keine detaillierte Liste gesehen, es scheint nicht so viel Aufsehen um C11 zu geben wie in C ++ 11. Es gibt eine kurze Mitteilung für das kommende GCC 4.7 hier: http://gcc.gnu.org/gcc-4.7/changes.html . Informationen zur Parallelitätsunterstützung finden Sie auf der C ++ 11-Statusseite hier unter http://gcc.gnu.org/projects/cxx0x.html . Unter http://gcc.gnu.org/wiki/Atomic finden Sie auch einige Hinweise zum aktuellen Status und zu den Plänen für GCC (laut dieser Seite ist stdatomic.h verfügbar). Für andere Compiler gibt es hier eine schöne Liste des C ++ 11-Status für verschiedene Compiler http://www.aristeia.com/C++11/C++11FeatureAvailability.htm. Über die dortigen Links kann der Status der Parallelitätsunterstützung überprüft werden. Unter der Annahme, dass der betreffende Anbieter die Unterstützung von C11 plant, ist die C11-Parallelitätsunterstützung dann wahrscheinlich auf ungefähr demselben Niveau.
quelle
xthreads.h
(Sie finden ihn unter demthr
Ordner im Include-Verzeichnis). Es ist fast identisch mitthreads.h
. Ich glaube jedoch, dass dies nur erstellt wurde, um die Implementierung von C ++ - Threads zu unterstützen. Trotzdem funktioniert es gut.Hinsichtlich
What compilers provide support for the above mentioned features?
Pelles C unterstützt C11
<threads.h>
. Erstellung von Threads mitPelles C
Compiler-Beispiel:#include <stdio.h> #include <threads.h> #define NUM_THREADS 7 static int threadData[NUM_THREADS]; int threadFunction(void * data) { printf("%d-th thread up\n", *(int*)data); return 0; } int main(void) { thrd_t threadId[NUM_THREADS]; // init thread data for (int i=0; i < NUM_THREADS; ++i) threadData[i] = i; // start NUM_THREADS amount of threads for (int i=0; i < NUM_THREADS; ++i) { if (thrd_create(threadId+i, threadFunction, threadData+i) != thrd_success) { printf("%d-th thread create error\n", i); return 0; } } // wait until all threads terminates for (int i=0; i < NUM_THREADS; ++i) thrd_join(threadId[i], NULL); return 0; }
BEARBEITEN : Das Problem mit gemeinsam genutzten Thread-Daten und das Problem, dass
main()
alle Threads früher beendet werden, wurden behoben.quelle
Janneb hat bereits viele Erklärungen gegeben. Für deine letzten Fragen
Die gcc-Compilerfamilie (clang, icc, opencc) unterstützt die meisten Semantiken, die der neue Standard erfordert. Es gibt nur syntaktische Unterschiede. (Clang implementiert sogar
_Generic
in der neuesten Version.)Für P99 habe ich Wrapper-Makros geschrieben , die die meisten Funktionen einer C11-Syntax zuordnen oder dieser nahe kommen (zum Emulieren
_Generic
).Wenn Sie also einen dieser Compiler haben und sich auf einem POSIX-System befinden, können Sie sofort eine Menge (die meisten) von C11 verwenden: Threads mit allen Typen
mtx_h
usw., Atomics mit_Atomic
, generische Typmakros (Syntax unterscheidet sich geringfügig von C11) ,_Static_assert
und die Ausrichtung Sachen.quelle
mtx_t
,cond_t
und solche Sachen.__GNUC__
Makro auf einen bestimmten Wert.