Was ist ein atomic?



  • 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