Was ist ein atomic?



  • [...] Ich finde ( und auch früher) wirklich nirgends im Netz eine Erklärung was eigentlich ein atomic ist (habs versucht, ehrlich! Aber es erschließt sich mir nicht aus dem Kontext).

    Hi!

    Versuche ab und zu herauszufinden, was ein atomic ist, es klappt allerdings nicht sonderlich gut, da im Netz viel zum Thema ist, aber keine Definition (oder zumindest habe ich keine gefunden).

    Im MSDN hab ich nach etwas rumpöbeln das gelesen:

    On all modern processors, you can assume that reads and writes of naturally aligned native types are atomic. As long as the memory bus is at least as wide as the type being read or written, the CPU reads and writes these types in a single bus transaction, making it impossible for other threads to see them in a half-completed state.

    Heißt das, solange ein bspw. integraler Datentyp so groß/kleiner als ein Maschinenwort ist, ist er atomar (ein atomic)? Und was bringt dann das Klassentemplate?

    Vielen Dank im Voraus,

    Hacker



  • Hilft dir das weiter?



  • Ein atomarer Datentyp ist ein Datentyp, dessen Werte der aus mehreren Threads zur gleichen Zeit verändert oder gelesen werden können, ohne dass ein data-race ensteht. Obwohl das bei Maschinenwörtern unter vielen Plattformen so ist, ist das bei Atomics unter allen Plattformen garantiert.

    Warum sollte man atomics verwendet? Hauptsächlich, weil sie effizienter sind als Mutexe.



  • 314159265358979 schrieb:

    Warum sollte man atomics verwendet? Hauptsächlich, weil sie effizienter sind als Mutexe.

    Das heißt, anstatt sich einen Mutex zu basteln, soll man einfach das atomic-template verwenden, weil es besser ist? Und funktioniert dieser nur für Skalare Datentypen?



  • @icarus: Ja, Danke



  • Hacker schrieb:

    Das heißt, anstatt sich einen Mutex zu basteln, soll man einfach das atomic-template verwenden, weil es besser ist?

    Jein. Bei einzelnen Operationen kann man atomics verwenden. Sobald man aber mehr als eine Operation hat, können trotz atomics inkonsistente Daten entstehen. Mehrere Operationen "sichern" kann man nur mit einem Mutex.

    Hacker schrieb:

    Und funktioniert dieser nur für Skalare Datentypen?

    Ja.



  • Falls man einen nicht-skalaren Typen vorliegen hat, auf den man nicht locken moechte, dann kann man TAS (Test and Swap) anwenden.



  • 314159265358979 schrieb:

    Hacker schrieb:

    Das heißt, anstatt sich einen Mutex zu basteln, soll man einfach das atomic-template verwenden, weil es besser ist?

    Jein. Bei einzelnen Operationen kann man atomics verwenden. Sobald man aber mehr als eine Operation hat, können trotz atomics inkonsistente Daten entstehen. Mehrere Operationen "sichern" kann man nur mit einem Mutex.

    Das heißt bei Aktionen wie Lade-Inkrementiere-Speichere funktioniert das. Nicht bei Division (wo ja eine Reihe von Operationen stattfindet) oder nur nicht bei mehreren Operationen (laden, Dividieren, Addieren, speichern)? Hängt das davon ab ob die Operation in einem Taktzyklus ausführbar ist?



  • icarus2 schrieb:

    Falls man einen nicht-skalaren Typen vorliegen hat, auf den man nicht locken moechte, dann kann man TAS (Test and Swap) anwenden.

    Das wurde auch in deinem Link erwähnt.. 😃



  • Hacker schrieb:

    icarus2 schrieb:

    Falls man einen nicht-skalaren Typen vorliegen hat, auf den man nicht locken moechte, dann kann man TAS (Test and Swap) anwenden.

    Das wurde auch in deinem Link erwähnt.. 😃

    Ich wusste ja nicht wie weit du gelesen hast. Deswegen wollte ich es hervorheben 😉



  • Hacker schrieb:

    314159265358979 schrieb:

    Hacker schrieb:

    Das heißt, anstatt sich einen Mutex zu basteln, soll man einfach das atomic-template verwenden, weil es besser ist?

    Jein. Bei einzelnen Operationen kann man atomics verwenden. Sobald man aber mehr als eine Operation hat, können trotz atomics inkonsistente Daten entstehen. Mehrere Operationen "sichern" kann man nur mit einem Mutex.

    Das heißt bei Aktionen wie Lade-Inkrementiere-Speichere funktioniert das. Nicht bei Division (wo ja eine Reihe von Operationen stattfindet) oder nur nicht bei mehreren Operationen (laden, Dividieren, Addieren, speichern)? Hängt das davon ab ob die Operation in einem Taktzyklus ausführbar ist?

    push



  • Nein, das hat mit Taktzyklen wenig zu tun. Ein atomic_int kann alles, was ein int auch kann, nur eben atomar und es verhält sich genau gleich mit anderen built-int Typen und Zeigern.


Anmelden zum Antworten