Definition von “atomares Objekt”

Lesezeit: 7 Minuten

Im Standardjargon von C und C++ bedeutet der Ausdruck “atomares Objekt” meint “Objekt von atomarer Typ,„nicht wahr?

Kein Standard wird explizit jeden aus zwei Wörtern bestehenden Satz definieren, also macht man den C- und C++-Standards keinen Vorwurf, weil sie die explizite Definition dieses Satzes weggelassen haben. Wenn ich jedoch den C++17-Standard (draft hier), Sekt. 4.7.1(4), dass „alle Modifikationen an einem bestimmten atomaren Objekt M treten in einer bestimmten Gesamtreihenfolge auf, die als die bezeichnet wird Änderungsauftrag von M„– und wenn der Standard wiederholt ähnliche Ausdrücke verwendet, um eine immer präzisere Logik für Parallelität abzugrenzen – möchte ich sicher sein, dass ich nicht versehentlich falsch verstehe.

Gehe ich richtig davon aus, dass der Ausdruck “atomares Objekt” bedeutet

  • Objekt von atomarer Typ?

Die einzige plausible Alternative, die ich mir vorstellen kann, wäre, dass der Ausdruck stattdessen gemeint ist

  • richtig ausgerichtet Objekt klein genug, dass die Hardware es atomar handhaben könnte.

Was ist das bitte?

(Anmerkung: Ich markiere diese Frage sowohl mit C als auch mit C++, da die beiden Standards in Bezug auf die Atomik eine fast identische Sprache verwenden. Aus diesem Grund kann ein Experte in beiden Sprachen meines Wissens antworten. Wenn ich es aus irgendeinem Grund bin falsch, dann entfernen Sie bitte das C-Tag und behalten Sie das C++ bei.)

Referenz: Siehe auch diese Frage, für die meine Frage vorläufig ist.

Benutzer-Avatar
Bolov

Aus meiner Sicht gilt Atomarität – streng genommen – nicht für Typen oder Objekte, für die sie gilt Operationendh Sie können sagen, dass eine Operation atomar ist oder nicht.

Unter einem “atomaren Objekt” verstehen wir ein Objekt, dessen öffentliche Schnittstelle nur atomare Operationen offenlegt, dh alle Operationen, die Sie mit diesem Objekt durchführen können, sind atomar.

In C und C++ kann es sein, dass die Konzepte umgekehrt definiert sind: zuerst atomare Objekte definieren und dann atomare Operationen in Bezug auf atomare Objekte definieren. Für C und C++ war es wahrscheinlich sinnvoll, dies so zu definieren, da es beim Wortlaut des Standards in erster Linie um die Definition der Sprache geht. Aus theoretischer und abstrakter Funktionalitätsperspektive sind jedoch atomare Operationen das Hauptanliegen.

C++ hat den Standard std::atomic<T> Klassenvorlage, die zu den obigen Beschreibungen passt.

  • Nein, beide Standards sprechen ausdrücklich und freiwillig von atomaren Objekten. Atomare Operationen sind solche, die sich mit atomaren Objekten befassen.

    – Jens Gustedt

    26. Februar 2019 um 13:08 Uhr

  • @JensGustedt Nun, es war wahrscheinlich für C und C++ sinnvoll, dies auf diese Weise zu definieren, da sich der Wortlaut des Standards hauptsächlich mit der Definition der Sprache befasst. Aus theoretischer und abstrakter Funktionalitätsperspektive stehen atomare Operationen im Vordergrund. Habe die Antwort umformuliert.

    – Bolov

    26. Februar 2019 um 13:28 Uhr

  • @bolov Könnten Sie bitte bestätigen, ob ich aufgrund Ihrer Erklärung richtig verstehe: Wenn der Standard von “einer Operation” spricht A die ein atomares Objekt modifiziert M“, tut das Bezogene A bedeuten alle nicht konstanten Operationen der std::atomic basierendes Objekt M? Es gibt zB folgendes std::atomic Betrieb: void notify_one() noexcept. Es modifiziert die std::atomic Objekt, ändert aber nicht das zugrunde liegende T Objekt. Tut notify_one das atomare Objekt ändern M? (Tut M verweise auf die std::atomic<T> Objekt oder dessen Basiswert T Objekt?)

    – Brühig

    26. Juli um 9:32 Uhr


Benutzer-Avatar
Erorika

Der C++-Standard legt eine Reihe von Regeln für Operationen und Auswirkungen von Operationen auf atomare Objekte fest ([intro.races]). Wenn alle Operationen an einem Objekt diese Regeln erfüllen, dann ist dieses Objekt atomar.

der Ausdruck „atomares Objekt“ bedeutet „Objekt vom atomaren Typ“, nicht wahr?

So ist es in der Norm nicht formuliert. Da die Wirkung von Operationen jedoch durch die Art des Objekts bestimmt wird, ist dies keine unvernünftige Schlussfolgerung. Auch entsprechend: Atomic type ist ein Typ, dessen Instanzen atomare Objekte sind.

Die C++-Standardbibliothek bietet eine Reihe von Typen, die garantiert atomar sind, sowie Funktionen für diese Typen, die garantiert atomare Operationen sind ([atomics]).

richtig ausgerichtetes Objekt, das klein genug ist, dass die Hardware es atomar handhaben könnte.

Der C++-Standard spezifiziert nichts über die Ausrichtung oder Größe von atomaren Objekten.

Wenn ein Objekt/Typ garantiert atomar ist (vgl [atomics]) und wenn die Hardware solche Anforderungen an die Atomizität hat, muss entweder die Implementierung der Sprache garantieren, dass diese Anforderungen erfüllt werden, oder die Implementierung muss Sperren verwenden, um die Atomizität zu erzwingen.

  • Ich kann mir einen Typ vorstellen, der seine Atomie während der Laufzeit ändern kann. Ich bin mir nicht sicher, ob das eine gute Sache ist, aber normalerweise achten sie sehr darauf, die Allgemeingültigkeit des Standards nicht einzuschränken, wenn dies nicht erforderlich ist. Vielleicht gibt es deshalb keinen “atomaren Typ”, sondern nur “atomare Objekte”.

    – 463035818_ist_keine_Nummer

    26. Februar 2019 um 12:50 Uhr


  • @ user463035818 Ich nehme an, Sie könnten einen solchen Typ bedingt atomar nennen. Es gibt atomare Typen, die in spezifiziert sind [atomics] Sektion.

    – Erorika

    26. Februar 2019 um 12:53 Uhr


  • @ user463035818 Dies ist wahrscheinlich der Grund, warum das Mitglied von std::atomic benannt is_always_lock_free. Beachten Sie auch: “Atomtypen dürfen manchmal auch sperrenfrei sein, z. B. wenn nur ausgerichtete Speicherzugriffe auf einer bestimmten Architektur natürlich atomar sind, müssen falsch ausgerichtete Objekte desselben Typs Sperren verwenden.”

    – Max Langhof

    26. Februar 2019 um 13:15 Uhr

  • @MaxLanghof Ich muss zugeben, mein Kommentar sollte hauptsächlich meiner Unwissenheit und Verwirrung Ausdruck verleihen ;). Ich werde noch viel mehr lesen müssen, um zu verstehen, was los ist. Ich hoffe, ich habe später Zeit, auf diese Frage/Antwort zurückzukommen …

    – 463035818_ist_keine_Nummer

    26. Februar 2019 um 13:17 Uhr

  • @ user463035818: Es gibt viele Situationen, in denen einige bestimmte Zugriffe auf einige Objekte in Bezug zueinander geordnet werden müssen, die meisten Operationen jedoch nicht. Soweit ich das beurteilen kann, hat der Standard jedoch keine Möglichkeit, die Reihenfolge von Operationen für “normale” Objekte zu erzwingen.

    – Superkatze

    26. Februar 2019 um 22:05 Uhr

Ich kann für C antworten, aber C++ soll in diesen Punkten tatsächlich mit C synchron sein.

Ja, wenn der C-Standard von “atomaren Objekten” spricht, meint er ein Objekt mit einem effektiven Typ, der atomar qualifiziert ist. Aber es scheint auch, dass dies nicht explizit aufgeschrieben ist, also wäre es wahrscheinlich eine gute Idee, das hinzuzufügen. Ich werde dafür sorgen.

Abgesehen von einigen Leuten gibt es auch keine atomaren Operationen in C ohne atomare Objekte. Dies wird freiwillig so festgelegt, dass die Atomarität des Zugriffs auf diese Objekte niemals beeinträchtigt werden kann.

  • Wenn Sie Änderungen am C-Standard vorschlagen, um dies zu klären, wäre es wahrscheinlich eine gute Idee, den Status von zu klären sig_atomic_t zur gleichen Zeit, da es “atomar” in seinem Namen hat, aber AFAIK ist es nicht ein _Atomic-qualifizierter Typ und bietet nur die schwächere Garantie, dass es wohldefiniert zu speichern ist, um a volatile sig_atomic_t Variable von einem Signalhandler. (Ich schlage hier keine inhaltliche Änderung vor, nur dass der Text dies betonen sollte sig_atomic_t ist nicht _Atomic.)

    – zol

    26. Februar 2019 um 16:18 Uhr


  • Wie sollte ein Programmierer mit Situationen umgehen, in denen es notwendig ist, zB sicherzustellen, dass ein Objekt, das über “normale” Zeiger geschrieben wurde, diese Zugriffe nicht durch den Compiler über etwas Bestimmtes neu geordnet hat volatile schreiben, dass später im selben Thread durchgeführt werden?

    – Superkatze

    26. Februar 2019 um 22:11 Uhr

1320600cookie-checkDefinition von “atomares Objekt”

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

Privacy policy