Multi-Threading-Unterstützung in c11

Lesezeit: 9 Minuten

Benutzeravatar von Alok Save
Alok Speichern

Der neue C11-Standard bietet eine Unterstützung für Multi-Threading.
Meine Fragen sind etwas abwechslungsreich, aber definitiv beantwortbar.
Ich habe mir den C11 angesehen n1570 Entwurf.
Es sagt:

Unterstützung für mehrere Ausführungsthreads, einschließlich eines verbesserten Speichersequenzierungsmodells, atomarer Objekte und Thread-lokaler Speicherung (<stdatomic.h> und <threads.h>)

Was ist der Verbessertes Speichersequenzierungsmodell? Wie/Was ändert sich gegenüber dem c99-Standard?

Anstatt nur aus dem Standard zu zitieren, würde ich es begrüßen, wenn jemand tiefer in sie eintaucht und versucht, die damit verbundene Semantik zu erklären.

Soweit ich weiß, bietet C11 Unterstützung für:

  • Thread-Erstellung und -Verwaltung
  • Mutex
  • Bedingte Variablen
  • Threadspezifischer Speicher &
  • Atomare Objekte

Ich hoffe, ich habe nichts übersehen?
Da jetzt die Standardbibliothek selbst alle für Multi-Threading erforderlichen Funktionalitäten bereitstellt (bereitstellen wird), wären POSIX und solche Bibliotheken (für Multi-Threading-Unterstützung) in Zukunft nicht mehr erforderlich?

Zu guter Letzt: 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?

  • Siehe auch: stackoverflow.com/questions/4938258/…

    – bdonlan

    16. Januar 2012 um 6:17 Uhr

  • @bdonlan: Die Frage bezieht sich auf c11 und nicht auf c++11. Beide sind unterschiedlich. Beide Links, die Sie angegeben haben, sind für c++11 und nicht für c11.duh?

    – Alok Speichern

    16. Januar 2012 um 6:19 Uhr


  • Ich stimme nahe (“exaktes Duplikat”), weil 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 – seine Antwort kann daher niemals akzeptiert werden, da sie nicht die gesamte Frage beantwortet, und es kann sein, dass es niemals eine akzeptierte Antwort gibt. Bitte teilen Sie Ihre Frage auf und entfernen Sie den genau doppelten Teil (oder geben Sie an, warum er sich von den von mir verlinkten Fragen unterscheidet).

    – bdonlan

    16. Januar 2012 um 6:25 Uhr

  • … oh, ich sehe jetzt, es geht um C11, 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, die Antwort wird ähnlich sein mit unterschiedlicher Syntax) 2) IST das alles, was C11 bietet? 3) Wird pthreads etc noch benötigt? 4) Wie schreitet die Unterstützung für den C11-Compiler voran?

    – bdonlan

    16. Januar 2012 um 6:25 Uhr


  • @bdonlan: Ich glaube 1-3 Qs sind logisch verwandt und sollten zusammen gruppiert werden. Eine Antwort für eine der 3 würde alle 3 berühren. Vielleicht 4 könnte ein separates Q sein, aber ich fühlte mich nicht berechtigt, ein Q nur dafür zu beginnen.

    – Alok Speichern

    16. Januar 2012 um 6:31 Uhr


Benutzeravatar von Janneb
janeb

Schreiben Sie C++11 zunächst nicht ab. Die Nebenläufigkeitsarbeit für die neuen Standards wurde unter dem Dach von C++11 durchgeführt und dann mit dem ausdrücklichen Ziel der Kompatibilität in C11 importiert. Während es einige syntaktische Unterschiede gibt (z. B. weil Plain C keine Templates hat oder Funktionen überladen werden), sind sie semantisch vom Design her identisch. Als “Beweis” dafür kann man die WG14-Papiere nachschlagen. Z.B:

und Verweise darin. Mehr finden Sie unter
Öffnen Sie die Std-Website

Nun zu deinen 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 unter C++11 hat ein standardisiertes Speichermodell eingeführt. Was bedeutet das? Und wie wird es sich auf die C++-Programmierung auswirken? das wurde schon in den kommentaren erwähnt. Für ein tieferes Verständnis ist eine Stackoverflow-Antwort vielleicht nicht der richtige Ort (schon gar nicht eine Frage mit mehreren Teilfragen!). Aber zum Glück Hans Böhm unterhält eine sehr gute Seite mit interessanten Links zum Weiterlesen (Beachten Sie auch hier, dass die Speichermodelle C11 und C++11 semantisch identisch sind.)

Ich hoffe, ich habe nichts übersehen?

Zusammen mit dem Speichermodell scheint Ihre Liste die Nebenläufigkeitszusätze in C11 abzudecken. Für andere Änderungen Wikipedia hat eine Liste; Aus dem Kopf fällt mir nichts ein, was die Wikipedia-Liste übersehen hat.

Da jetzt die Standardbibliothek selbst alle für Multi-Threading erforderlichen Funktionalitäten bereitstellt (bereitstellen wird), wären POSIX und solche Bibliotheken (für Multi-Threading-Unterstützung) in Zukunft nicht mehr erforderlich?

Ja, es wird Bedarf an ihnen 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 herum implementiert; Verdammt, es gibt sogar eine dokumentierte Möglichkeit, einen Zeiger auf den zugrunde liegenden nativen Thread abzurufen, falls jemand etwas tun muss, das über das hinausgeht, was die C(++)-Thread-Bibliothek unterstützt. Stellen Sie sich die C(++)11-Thread-Bibliothek eher wie einen portablen Wrapper mit dem kleinsten gemeinsamen Nenner um die verschiedenen nativen Thread-Bibliotheken vor.

Zu guter Letzt: 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 Wirbel um C11 zu geben im Vergleich zu C++11. Eine kurze Ankündigung zum kommenden GCC 4.7 gibt es hier: http://gcc.gnu.org/gcc-4.7/changes.html . Für die Parallelitätsunterstützung kann man die Unterstützung für Parallelität auf der C++11-Statusseite hier überprüfen: http://gcc.gnu.org/projects/cxx0x.html . Es gibt auch einige Hinweise zum aktuellen Stand und den Plänen für GCC unter http://gcc.gnu.org/wiki/Atomic (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 Links dort kann man den Status der Nebenläufigkeitsunterstützung überprüfen, und unter der Annahme, dass der betreffende Anbieter plant, C11 zu unterstützen, wird die C11-Nebenläufigkeitsunterstützung dann wahrscheinlich auf ungefähr dem gleichen Niveau sein.

  • Vielen Dank! Ein paar Kommentare: Ich bin nicht ganz überzeugt von dem Argument, dass die Parallelität in c11 von C ++ 11 inspiriert oder importiert wurde. Alle glaubwürdigen Referenzen, die dies sagen, werden meinen Glauben stärken, es zu akzeptieren. Über die Notwendigkeit von POSIX- und Multithreading-Bibliotheken in der Zukunft, Ein Benutzer muss sich nicht die Mühe machen, sicherzustellen, dass diese vorhanden sind, da der Standard jetzt vorschreibt, dass eine Implementierung sie vorhanden sein muss. Selbst wenn die Standard-Lib-API nur Wrapper über native Libs sind, liegt es in der Verantwortung der Implementierung, das Ganze bereitzustellen Paket anders als zuvor. Nette Links zur Compiler-Unterstützung.

    – Alok Speichern

    17. Januar 2012 um 5:22 Uhr

  • @Als: Ich habe einige Links zum C++-Erbe der Nebenläufigkeitsarbeit hinzugefügt. Bezüglich Ihres zweiten Punktes bedenken Sie, dass 1) es noch lange dauern wird, bis C11 so weit verbreitet ist, dass man davon ausgehen kann, dass es verfügbar ist 2) dennoch sind Threads und Atomic ein optionaler Teil des Standards, siehe zB __STDC_NO_THREADS__– und __STDC_NO_ATOMICS__-Makros. Davon abgesehen ist das Speichermodell meiner Meinung nach ein großer Schritt nach vorne, da es angibt, wie sich der Compiler bei Speicherzugriffen durch mehrere Threads verhalten soll, was Programmen, die pthreads verwenden, genauso hilft wie solchen, die die C11-Threads verwenden.

    – janeb

    17. Januar 2012 um 8:28 Uhr


  • @Als: Einen weiteren Link hinzugefügt (n1349). Entschuldigen Sie auch den Formatierungsfehler im vorherigen Kommentar.

    – janeb

    17. Januar 2012 um 9:39 Uhr

  • Gibt es eine Standardmethode zum Anfordern einer „Compiler-Speicherzugriffs“-Barriere, bei der ein Compiler sicherstellen müsste, dass alle ausstehenden Schreibvorgänge an die zugrunde liegende Plattform ausgegeben werden, bevor die Ausführung die Barriere passiert, 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 zuverlässig auf allen Compilern für diese Plattform laufen könnte, und der Gedanke, eine Barriere für die Compiler-Speichersequenzierung zu schaffen, scheint kaum obskur zu sein.

    – Superkatze

    12. Mai 2016 um 22:30 Uhr


  • Ab Visual Studio 2017 gibt es einen Header namens xthreads.h (Sie finden unter der thr Ordner im include-Verzeichnis). Es ist fast identisch mit threads.h. Aber ich glaube, dies wurde nur erstellt, um die C++-Thread-Implementierung zu unterstützen. Trotzdem funktioniert es prima.

    – nervender_Tintenfisch

    21. Februar 2019 um 14:08 Uhr


Benutzeravatar von Agnius Vasiliauskas
Agnius Wassilauskas

Bezüglich What compilers provide support for the above mentioned features?


Pelles C unterstützt C11 <threads.h>. Erstellen von Threads mit Pelles 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: Problem mit gemeinsamen Thread-Daten und Problem beim Beenden beseitigt main() früher als alle Threads beendet werden.

Benutzeravatar von Jens Gustedt
Jens Gustedt

Janneb hat bereits viele Erklärungen gegeben. Zu deinen letzten Fragen

Zu guter Letzt: 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 sogar implementiert _Generic in der neuesten Version.)

Zum P99 ich habe geschrieben Wrapper-Makros die die meisten Funktionen auf etwas abbilden, das bereits C11-Syntax ist oder ihr nahe kommt (zur Emulation _Generic).

Wenn Sie also einen dieser Compiler haben und auf einem POSIX-System sind, können Sie sofort damit beginnen, viel (fast) C11 zu verwenden: Threads mit allen Typen mtx_h etc, Atome mit _Atomicgeben Sie generische Makros ein (Syntax weicht geringfügig von C11 ab), _Static_assert und das Alignment-Zeug.

  • “threads.h” wird meiner Meinung nach Teil von C-Bibliotheken (wie glibc) sein, nicht nur Compiler. Keine aktuelle C-Bibliothek und kein Compiler bietet volle Unterstützung für “echtes” Multithreading (vorerst und in naher Zukunft ab 02/2k12).

    – Tomás Pruzina

    4. Februar 2012 um 15:31 Uhr

  • @AoeAoe, P99 enthält auch eine vollständige Emulation des Teils “threads.h” über POSIX-Threads, einschließlich mtx_t, cond_t und solche Sachen.

    – Jens Gustedt

    4. Februar 2012 um 16:19 Uhr

  • Was definiert “gcc-Familie”? Mir ist keine Beziehung zwischen dem GNU-C-Compiler, dem Intel-C-Compiler und Clang bekannt.

    – Namen53

    29. Oktober 2012 um 15:55 Uhr

  • @ bames53, es gibt die einfache Beziehung, dass diese Compiler zu versuchen scheinen, in großen Teilen mit gcc kompatibel zu sein. Insbesondere definieren sie alle die __GNUC__ Makro auf einen Wert.

    – Jens Gustedt

    29. Oktober 2012 um 16:01 Uhr

1416790cookie-checkMulti-Threading-Unterstützung in c11

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy