Frage

Was ist das Speichermodell für die Parallelität in C ++ 03?

(Und nicht ++ C 11 Wechsel des Speichermodell zu unterstützen Parallelität besser?)

War es hilfreich?

Lösung

Die C ++ Speichermodell ist die Angabe, wann und warum physische Speicher gelesen / geschrieben in Bezug auf C ++ Code.

Bis zum nächsten C ++ Standard, der C ++ Speichermodell ist die gleiche wie C. In dem C ++ 0x-Standard, ein richtiges Speichermodell für Multithreading erwartet wird, aufgenommen werden (siehe hier ), und es wird ein Teil möglicherweise von der nächsten Revision des C-Standard, C1X sein. Die aktuelle ist rudimentär:

  • es gibt nur das Verhalten von Speicheroperationen zu beobachten durch das aktuelle Programm.
  • es sagt nichts über die gleichzeitige Speicherzugriffe, wenn mehrere Prozesse denselben Speicher zugreifen (es gibt keinen Begriff von Shared Memory oder Prozesse ist).
  • es sagt nichts über die gleichzeitige Speicherzugriffe, wenn mehrere Threads den gleichen Speicher zugreifen (es gibt keine Ahnung von Threads).
  • es bietet keine Möglichkeit, eine Bestellung für Speicherzugriffe (Compiler-Optimierungen umfassen Kodeverschiebung und den letzten Prozessoren neu anordnen Zugriffe, beide Muster wie doppelt geprüft Initialisierung brechen kann) angeben.

So wird der aktuelle Zustand ist: C ++ Speicheroperationen nur dann angegeben werden, wenn Sie einen Prozess, mit dem Haupt-Thread und nicht schreiben Code, der auf einer bestimmten Reihenfolge der variablen Lese hängt / schreibt und das ist es. Im Wesentlichen bedeutet dies, dass abgesehen von dem traditionellen Hallo Welt Programm sind Sie geschraubt.

Natürlich, werden Sie prompt, dass hinzufügen „es heute auf meinem Rechner funktioniert, können Sie möglicherweise nicht richtig sein“ . Der richtige Satz wäre "es funktioniert heute auf meiner Maschine mit dieser speziellen Kombination von Hardware, Betriebssystem (Thread-Bibliothek) und Compiler, die voneinander genug wissen, etwas zu implementieren, die etwas funktioniert, aber wird wahrscheinlich irgendwann brechen „.

Ok ok, das ist ein bisschen hart, aber die Hölle, selbst Herb Sutter räumt ein, dass (nur das Intro lesen) und er spricht alle pre 2007-Versionen eines der am weitesten verbreiteten C / C ++ Toolchain ...

Die C ++ Standard Komitee versucht, mit etwas einfallen lassen, die all diese Probleme anzugehen, während noch weniger sein beschränke (und damit eine bessere Leistung) als Java-Speichermodell.

Hans Boehm gesammelt hier einige Hinweise auf Arbeiten zu diesem Thema, sowohl akademisch, und aus dem C ++ Ausschuss.

Andere Tipps

einige andere Antworten sieht, scheint es viele C ++ Programmierer sind nicht einmal bewusst, was das „Speichermodell“ Sie Mittel bitten.

Die Fragen sind über Speichermodell im Sinne: Was garantiert (falls vorhanden) wird dort über Schreib- / Lese Umordnung (die auf der Compiler-Seite oder auf der Seite der Laufzeit geschehen kann)? Diese Frage ist sehr wichtig für Multi-Thread-Programmierung, da ohne solche Regeln korrekt Multi-Thread-Programme zu schreiben nicht möglich ist, und etwas überraschend Wahrheit ist, mit dem aktuellen Mangel an explizitem Speichermodell vieler Multithreaded-Programme funktionieren mehr oder weniger „durch pures Glück“ - meist dank Compiler Zeiger Aliasing über Funktionsaufrufe übernehmen. - finden Sie unter Themen Kann als Bibliothek nicht

In der aktuellen C ++ gibt es kein Standard-Speichermodell. Einige Compiler definieren Speichermodell für flüchtige Variablen, aber das ist nicht dem Standard entsprechende. C ++ 0x definiert neue „atomic“ Primitiven für diesen Zweck. Erschöpfender Ausgangspunkt zu überprüfen, welche die letzte Status kann unter Threads und Speichermodell gefunden werden für C ++

Wichtige Links sind auch Concurrency Speichermodell , Atomic Typen und C ++ Datenabhängigkeit Reihenfolge: Atomics und Speichermodell Standard Vorschläge.

Leider gibt es in C ++ gibt es kein „Standard-Speichermodell“ wie das von Java. Die eigentliche Implementierung wird die Compiler, Laufzeitbibliotheken und Prozessoren überlassen.

So ist das C ++ Speichermodell == chaotische Mischung Masch von Modellen, was bedeutet, Sie müssen immer versuchen, sicheren Code zu schreiben, die nicht auf einem bestimmten Speichermodell abhängen, und das gilt auch für Gewinde Programmierung als auch, weil die Compiler kann jede Optimierung tut es, um außerhalb eines kritischen Abschnitts will, auch aus der Auftragsabwicklung!

Was ist die Papiere auf der C ++ Standard Ausschuss Webseite Überprüfung:

Wenn Sie möchten, ein tieferes Verständnis der Shared-Memory-Konsistenzmodelle bekommen, würde ich Sie auf die folgende Anleitung beziehen.

http://rsim.cs.uiuc.edu/~sadve /Publications/computer96.pdf

Kurze Antwort: Es gibt keine

Lange Antwort: C ++ nicht verwalteten Speicher verfügt, müssen Sie es zuweisen und kostenlos it yourself. Smart-Pointer-Klassen können machen diese weniger belastend. Wenn Sie vergessen, Speicher freizugeben, die Sie zugeordnet sind, ist, dass ein Speicherverlust und ein Fehler. Wenn Sie versuchen, Speicher zu verwenden, nachdem es freigegeben werden kann, oder Sie versuchen, Speicher mehr als einmal zu befreien, das sind auch fiese Bugs.

Wie bei den Low-Level-Details, C ++ ist nicht festgelegt, dass - es ist an die Hardware. Der Speicher wird über Zeiger zugegriffen, die irgendeine Art von Speicheradresse enthalten. Speicheradressen können entweder physikalische Adressen oder virtuelle Adressen sein. Sie werden nur physikalische Adressen sehen, wenn Sie auf einem Betriebssystem-Kernel arbeiten, oder wenn Sie gerade lesen alten DOS-Code, der im Real-Modus lief. Für weitere Details lesen Sie virtuellen Speicher , es gibt viele gute Ressourcen gibt.

Die x86-Architektur ermöglicht auch Speicher mit Segmentbeschreibern angesprochen werden. Das ist eine ganze nother Dose Würmer, die seit den Tagen von Win16 nicht wirklich verwendet wurde, und wenn Sie Glück haben, werden Sie nie mit ihm zu tun haben.

Auf den Punkt gebracht, die C ++ Speichermodell besteht aus ...

  • Ein Stapel, der nach unten wächst - das heißt, wenn Sie einen Stapel Rahmen der Stapelzeiger schieben einen Wert kleiner, dass es

  • Ein Haufen, der nach oben wächst, das ist das Ende-Adresse des neu zugewiesenen Speichers größer ist es vor dem Speicher war. Sie weisen Speicher im Heap malloc () oder neu. Wenn nicht genügend Speicher zur Verfügung in dem Heap ist dann malloc (oder neu) ruft die Systemfunktion brk () sbrk (), um die Größe des Haufens zu erhöhen. Wenn der Aufruf von brk () oder sbrk () fehlschlägt dann malloc oder neue nicht mit einem der Speicher Ausnahme.

Sie sollten sich nicht kümmern müssen, ob der Stapel oder Haufen wachsen nach unten oder nach oben und in einigen Systemen können diese umgekehrt arbeiten. Man denke nur an, dass der Stapel und Haufen von den Enden des Adressraums wachsen nach innen.

  • A Speicherzuordner, malloc, die Speicher in Form von 8-Bit-Bytes zuordnet. New weist auch Speicher, aber die Größe des Speichers, dass es auf die Größe des Objekts basiert zuordnet newed wird.

  • Text Raum, der den ausführbaren Code enthält. Text befindet sich unter dem Haufen. Sie können den Text nicht Raum während der Ausführung

  • ändern

Ein Programm kann andere Sonderabschnitte unter Text.

Sie können sehen, wie ein Programm statisch organisiert wird (bevor es geladen wird) mit objdump auf Linux-Systemen.

Ich habe bemerkt, dass, obwohl Sie es nicht in Ihrer Frage erwähnt hat, „Gleichzeitigkeit“ eines der Schlüsselwörter ist, dass Sie auf diese Frage zugeordnet. Einfädeln Systeme allcoate für jeden Thread auf den Haufen zusätzlichen Fadenraum und zu verwalten, dann den Stapelzeiger zwischen Threads zu wechseln.

Es gibt viel mehr Details, von denen viele sind spezifisch für particluar Hardware, Betriebssysteme oder Threading-System, aber das ist die wesentliche Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top