Multithreading-Unterstützung in c11

68

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?

Alok Speichern
quelle
20
@bdonlan: Die Frage bezieht sich auf c11 und nicht auf c ++ 11. Beide sind unterschiedlich. Beide von Ihnen angegebenen Links beziehen sich auf c ++ 11 und nicht auf c11.duh?
Alok Save
3
Ich stimme eng ab ('genaues Duplikat'), da Ihre erste Frage (Über das Sequenzierungsmodell) bereits beantwortet wurde. Es ist schwierig, Fragen zu beantworten, die mehrere Fragen enthalten, da jemand möglicherweise nur einen Teil Ihrer Frage kennt. Ihre Antwort kann daher niemals akzeptiert werden, da sie nicht die gesamte Frage beantwortet und es möglicherweise nie eine akzeptierte Antwort gibt. Bitte teilen Sie Ihre Frage auf und entfernen Sie das genaue doppelte Teil (oder geben Sie an, warum es sich von den von mir verknüpften Fragen unterscheidet).
Bdonlan
2
... oh, ich sehe jetzt, dass es um C11 geht, nicht um C ++ 11. Egal Dann! Ich empfehle Ihnen dennoch, Ihre Frage aufzuteilen - Sie haben eine Frage zu 1) Was ist ein Speichersequenzierungsmodell? (Möglicherweise von C ++ 11 beantwortet, wird die Antwort mit unterschiedlicher Syntax ähnlich sein.) 2) Ist dies alles, was C11 bietet? 3) Werden noch Pthreads usw. benötigt? 4) Wie läuft die Unterstützung des C11-Compilers ab?
Bdonlan
1
@bdonlan: Ich glaube, 1-3Qs sind logisch verwandt und sollten zusammengefasst werden. Eine Antwort für eine der 3 würde alle 3 berühren. Vielleicht 4könnte es sich um ein separates Q handeln, aber ich fühlte mich nicht berechtigt, ein Q nur dafür zu beginnen .
Alok Save

Antworten:

53

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.

janneb
quelle
Vielen Dank! Ein paar Kommentare, ich bin nicht ganz überzeugt von dem Argument, dass Parallelität in c11 von C ++ 11 inspiriert oder importiert wird. Alle glaubwürdigen Referenzen, die dies sagen, werden mein Vertrauen in die Akzeptanz stärken. Über die Notwendigkeit von POSIX- und Multithreading-Bibliotheken in Zukunft, Ein Benutzer muss sich nicht darum kümmern, dass diese vorhanden sind, da der Standard jetzt vorschreibt, dass eine Implementierung vorhanden sein muss. Selbst wenn die Standard-Lib-API nur ein Wrapper über native Libs ist, liegt es in der Verantwortung der Implementierung, die gesamte Bereitstellung bereitzustellen Paket anders als zuvor. Schöne Links auf der Compiler-Unterstützung.
Alok Save
@Als: Ich habe einige Links zum C ++ - Erbe der Parallelitätsarbeit hinzugefügt. Denken Sie bei Ihrem zweiten Punkt daran, dass 1) es lange dauern wird, bis C11 so häufig ist, dass man davon ausgehen kann, dass es verfügbar ist. 2) Trotzdem sind Threads und Atomics ein optionaler Bestandteil des Standards, siehe z. B. <code> __STDC_NO_THREADS__ </ code> und <code> __STDC_NO_ATOMICS__ </ code> Makros. Abgesehen davon ist IMHO das Speichermodell ein großer Schritt vorwärts, da es angibt, wie sich der Compiler bei Speicherzugriffen durch mehrere Threads verhalten soll, was Programmen hilft, die pthreads genauso verwenden wie solche, die die C11-Threads verwenden.
Janneb
@Als: Ein weiterer Link wurde hinzugefügt (n1349). Entschuldigen Sie auch, dass die Formatierung im vorherigen Kommentar fehlgeschlagen ist.
Janneb
Gibt es eine Standardmethode zum Anfordern einer Barriere für den "Compiler-Speicherzugriff", bei der ein Compiler sicherstellen muss, dass alle ausstehenden Schreibvorgänge an die zugrunde liegende Plattform ausgegeben werden, bevor die Ausführung die Barriere überschreitet, und alle Lesevorgänge einen Wert untersuchen, der irgendwann nach der Barriere vorhanden war? Auf vielen Plattformen stehen mehrere Compiler zur Verfügung, und es wäre hilfreich, wenn ein für eine bestimmte Plattform geschriebenes Programm auf allen Compilern dieser Plattform zuverlässig ausgeführt werden könnte, und der Gedanke, eine Barriere für die Sequenzierung des Compiler-Speichers zu erstellen, scheint kaum unklar.
Supercat
Ab Visual Studio 2017 gibt es einen Header mit dem Namen xthreads.h(Sie finden ihn unter dem thrOrdner im Include-Verzeichnis). Es ist fast identisch mit threads.h. Ich glaube jedoch, dass dies nur erstellt wurde, um die Implementierung von C ++ - Threads zu unterstützen. Trotzdem funktioniert es gut.
annoying_squid
7

Hinsichtlich What compilers provide support for the above mentioned features?


Pelles C unterstützt C11 <threads.h>. Erstellung von Threads mit Pelles CCompiler-Beispiel:

BEARBEITEN : Das Problem mit gemeinsam genutzten Thread-Daten und das Problem, dass main()alle Threads früher beendet werden, wurden behoben.

Agnius Vasiliauskas
quelle
3

Janneb hat bereits viele Erklärungen gegeben. Für deine letzten Fragen

Welche Compiler unterstützen die oben genannten Funktionen? Gibt es Hinweise auf Zeitpläne, wann diese unterstützt werden?

Die gcc-Compilerfamilie (clang, icc, opencc) unterstützt die meisten Semantiken, die der neue Standard erfordert. Es gibt nur syntaktische Unterschiede. (Clang implementiert sogar _Genericin 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_husw., Atomics mit _Atomic, generische Typmakros (Syntax unterscheidet sich geringfügig von C11) , _Static_assertund die Ausrichtung Sachen.

Jens Gustedt
quelle
1
"threads.h" wird imho Teil von C-Bibliotheken (wie glibc) sein, nicht nur Compiler. Keine aktuelle C-Bibliothek und kein Compiler bieten volle Unterstützung für "echtes" Multithreading (derzeit und in naher Zukunft ab 02 / 2k12).
Tomas Pruzina
@AoeAoe, P99 enthält auch eine vollständige Emulation des „threads.h“ Teil auf der POSIX - Threads, einschließlich mtx_t, cond_tund solche Sachen.
Jens Gustedt
2
Was macht "gcc family" aus? Ich kenne keine Beziehung zwischen dem GNU C-Compiler, dem Intel C-Compiler und Clang.
Bames53
6
@ bames53, es gibt die einfache Beziehung, dass diese Compiler zu versuchen scheinen, zu großen Teilen mit gcc kompatibel zu sein. Insbesondere definieren sie alle das __GNUC__Makro auf einen bestimmten Wert.
Jens Gustedt