12

C++ 11 hat eine Vorstellung von Threads. Zum Beispiel definiert es einen neuen Speicherspezifizierer thread_local und gibt an, dass für Variablen mit diesem Speicherbezeichner "es gibt ein unterschiedliches Objekt oder eine Referenz pro Thread" [basic.stc.thread].Was hält C++ 11 für einen "Thread"?

Was wird zu diesem Zweck als "Thread" angesehen? Sind es nur Threads, die mit der Standard-Thread-Bibliothek erstellt wurden (d. H. Die durch std::thread Objekte dargestellten)? Was ist mit Threads, die auf andere Weise erstellt wurden (zum Beispiel mit pthreads direkt unter Linux)? Was passiert, wenn ich eine Bibliothek verwende, die User-Space-Threads bereitstellt - bekommt jeder von ihnen seine eigenen Kopien von thread_local Objekten (ich sehe nicht wirklich, wie das implementiert werden könnte)?

Wenn die Antwort "es ist die Implementierung definiert, was als ein Thread für Zwecke wie thread_local angesehen wird", könnte jemand ein Beispiel geben, wie eine bekannte Implementierung dies definiert?

+0

@texasbruce Java * jetzt * hat diese Schlüsselwörter? Sie waren dort vor 17 Jahren. – EJP

Antwort

3

Nur Komponenten aus der Thread-Unterstützungsbibliothek zählen aufgrund dieser Anführungszeichen oder main, die die Standardzustände in einem eigenen Ausführungsthread ausführt.

1 Die folgenden Unterabschnitte beschreiben Komponenten Gewinde (1,10), führen mutual exclusion und kommunizieren Bedingungen und Werte zwischen Threads zu erstellen und zu verwalten, wie 148.

den Link in der Tabelle zusammengefasst 1.10 impliziert, dass die Themen, über die gesprochen wird, diese sind.

1 Ein Ausführungsthread (auch als Thread bezeichnet) ist ein einzelner Programmablauf der Steuerung innerhalb eines Programms, einschließlich der anfänglichen ...

daher nur er Fäden mir scheint verweisen zu den Stdlib-Threads (was std :: thread und alles, was die Thread-Unterstützungsbibliothek intern tut, bedeutet). Natürlich könnte thread_local in vielen Fällen am Ende mit den nativen Threads arbeiten (besonders wenn Sie auf einem bestimmten System denken, dass Sie normalerweise nicht mehr als eine Option für die Implementierung von Threads haben), aber soweit ich das beurteilen kann, gibt der Standard keine Garantie.

+0

Obwohl dies zutrifft und Implementierungen technisch mit der Unterstützung von 'thread_local' nur mit' std :: thread 'davonkommen könnten, wäre dies eine Implementierung von schlechter Qualität. Die bisherigen Implementierungen stellen sicher, dass 'thread_local' mit Systemthreads arbeitet und' std :: thread' Unterstützung für 'thread_local' durch die Systemthreadbibliothek unterstützt. – bames53

+1

@ bames53 nicht sicher, wie dies für meine Antwort gilt, alles was ich sage ist, dass ein "Thread" in C++ ist etwas, das intern implementiert wird, 'std :: thread' ist offensichtlich einer von diesen, aber andere Dinge könnten intern erzeugen ein "Faden". Auch wenn intern die Implementierung verwendet, sagen wir Pthreads, und sie am Ende arbeiten als "Thread" der Standard macht die Garantie dieser IMO. – aaronman

+0

Ja, ich stimme Ihnen zu, dass der Standard keine Garantie für etwas anderes als 'std :: thread' gibt. Ich füge das nur in der Praxis hinzu und bei Implementierungen, von denen ich weiß, dass "thread_local" mit den Threads des Systems arbeitet und nicht nur mit "std :: thread". – bames53

0

Der Standard beschreibt nicht, wie sich von anderen Bibliotheken und Systemaufrufen erzeugte Threads verhalten. Sie sind, was den Standard betrifft, in ihrem Verhalten undefiniert. Es gibt keine andere Möglichkeit, innerhalb von C++ mehrere Threads zu erstellen: Solche Bibliotheken oder Systemaufrufe tun Dinge, die nicht vom C++ - Standard standardisiert sind.

Nun verhält sich jeder solche Bibliotheks- und Systemaufruf wie durch seine eigenen Spezifikationen definiert. Ziemlich oft wird das C++ std::thread sogar auf solche Bibliotheken oder Systemaufrufe gebaut. Wie genau die Interaktion funktioniert, ist nicht spezifiziert.

3

C++ 11 §1.10/1 definiert die Ausdrücke:

A Ausführungsthread (auch als Gewinde bekannt) ist einen einzelnen Steuerungsfluss innerhalb eines Programms, einschließlich dem anfänglichen Aufruf einer bestimmten Top-Level-Funktion und rekursives Einschließen jedes Funktionsaufrufs, der anschließend vom Thread ausgeführt wird.[] Hinweis: Wenn ein Thread einen anderen erstellt, wird der erste Aufruf der Top-Level-Funktion des neuen Threads vom neuen Thread ausgeführt, nicht vom erzeugenden Thread. - Endnote]

Die kursiven Begriffe zeigen, dass dies definitiv ist. Man könnte argumentieren, dass diese Definition mathematisch mangelhaft ist, weil jeder Funktionsaufruf einen neuen Thread definiert, aber das ist offensichtlich falsch. Sie bedeuten maximal einzigen Fluss der Kontrolle, sonst würde die nicht normative Note den Effekt der normativen "rekursiv einschließlich" Text aufheben.

Vom Standpunkt der Kernsprache ist es nur nebensächlich, dass std::thread solch eine Sache verursacht.

Was passiert, wenn ich eine Bibliothek verwenden, die Themen User-Space bietet - jedes von denen seine eigenen Kopien von thread_local Objekten bekommen (ich nicht wirklich sehen, wie das umgesetzt werden könnte)?

Es gibt keine Möglichkeit, eine solche Bibliothek ohne Kernelaufrufe zu schreiben. Aller Wahrscheinlichkeit nach sind alle Threads in Ihrem Prozess bereits eine High-Level-Abstraktion wie Pthreads, um den Kernel zu befriedigen. Die C++ - Standardbibliothek wird wahrscheinlich gegen die native Threading-Bibliothek geschrieben, um ohne zusätzlichen Kleber "einfach zu funktionieren". B. Objekte werden beim ersten Zugriff und nicht beim Start jedes neuen Threads initialisiert. Daher muss der Compiler nur eine Abfrage basierend auf pthread_self einfügen, um darauf zuzugreifen und möglicherweise zu initialisieren. Die Initialisierung würde einen Destruktor mit der pthread_cleanup Einrichtung registrieren.

Was ist implementation-defined hier ist, ob die bereits vorhandene native Bibliothek mit C++ kompatibel ist. Angenommen, sie stellen dies bereit, und es ist etwas, das die Kunden gerne hätten, und alle anderen Threading-Bibliotheken, die darauf aufbauen, werden automatisch kompatibel sein, abgesehen von anderen Konflikten.

+0

Also tatsächlich die OP-Frage zu beantworten, glauben Sie alles, was einen neuen Steuerungsfluss in einem Programm erzeugt, funktioniert garantiert mit etwas wie "thread_local" nach dem Standard – aaronman

+0

@ aaronman Yep. Ich füge noch eine Anmerkung hinzu, um klarzustellen ... – Potatoswatter