Unterschied zwischen Atombetrieb und Gewindesicherheit?


10

Aus der Diskussion, die ich gesehen habe, geht hervor, dass atomare Operation und Thread-Sicherheit dasselbe sind, aber viele Leute sagen, dass sie unterschiedlich sind. Kann mir jemand den Unterschied sagen, wenn es einen gibt?


4
Atomische Operationen tragen zur Gewährleistung der Thread-Sicherheit bei, aber wie können sie möglicherweise dasselbe sein ? Ein "Thread" ist nicht dasselbe wie eine "Operation".
user50849

Antworten:


11

Atomic - Operationen sind ein Weg , um achive Thread - Sicherheit entweder durch eine Art von Schlössern wie mit Mutexes oder Semaphore , die intern atomaren Operationen verwenden oder durch die Implementierung Sperre frei Synchronisation atomics und Speicher Zäune verwenden.

Atomische Operationen an primitiven Datentypen sind also ein Werkzeug, um die Thread-Sicherheit zu erreichen, gewährleisten jedoch nicht automatisch die Thread-Sicherheit, da Sie normalerweise mehrere Operationen haben, die aufeinander angewiesen sind. Sie müssen sicherstellen, dass diese Vorgänge ohne Unterbrechung ausgeführt werden, z. B. mithilfe von Mutexen.

Ja, das Schreiben eines dieser atomaren Datentypen in c # ist threadsicher, aber das macht die Funktion, die Sie in thread verwenden, nicht sicher. Es stellt nur sicher, dass der einzelne Schreibvorgang korrekt ausgeführt wird, auch wenn ein zweiter Thread "gleichzeitig" darauf zugreift. Trotzdem wird beim nächsten Lesen des aktuellen Threads nicht sichergestellt, dass der zuvor geschriebene Wert erhalten wird, da möglicherweise ein anderer Thread darauf geschrieben hat, sondern nur, dass der gelesene Wert gültig ist.


Sind int, bool, float threadsicher oder atomar?
user960567

1
@ user960567 - Datentypen sind genau das: Datentypen. Es ist Sache des Compilers, zu entscheiden, wie auf sie zugegriffen werden soll. Stellen Sie sich einen int64 auf einer 8086-CPU vor.
Mouviciel

2
Insbesondere in C # muss das Lesen und Schreiben der Frage für die grundlegenden Datentypen atomar sein. Siehe Ecma 334
user50849

2
Und ja, das Schreiben eines dieser atomaren Datentypen in c # ist threadsicher, aber das macht die Funktion, die Sie in threadsicher verwenden, nicht sicher. Es stellt nur sicher, dass der einzelne Schreibvorgang korrekt ausgeführt wird, auch wenn ein zweiter Thread "gleichzeitig" darauf zugreift. Trotzdem wird beim nächsten Lesen des aktuellen Threads nicht sichergestellt, dass der zuvor geschriebene Wert erhalten wird, da möglicherweise ein anderer Thread darauf geschrieben hat, sondern nur, dass der gelesene Wert gültig ist.
Archy

4
x = 5 ist in c # atomar. Aber unmittelbar nach dieser Operation könnte es überschrieben werden. x = x + 1 wird ausgeführt durch 1. Laden von x in Register 2. Inkrementieren von x in Register 3. Speichern von x in Speicher. Wenn ein zweiter Thread zur gleichen Zeit dasselbe tut, laden beide den gleichen Wert, erhöhen ihn und speichern ihn, was dazu führt, dass x nur einmal statt zweimal inkrementiert wird. InterlockedIncrement verwendet entweder einen speziellen Prozessorbefehl, um ein atomares Inkrement auszuführen, oder stellt dies durch Verwendung eines Sperrmechanismus, z. B. CAS, sicher, um sicherzustellen, dass kein anderer Thread den alten Wert lesen kann, während der neue Wert nicht geschrieben wird.
Archy

3

Atomizität und Fadensicherheit sind zwei verschiedene Dinge. Atomarität bezieht sich auf die "Alles-oder-Nichts" -Qualität einer Operation. Wenn eine Operation nicht zu 100% erfolgreich ausgeführt werden kann, sollte das System in dem Gesamtzustand bleiben, in dem es sich vor Beginn eines Teils der Operation befunden hat. Das klassische Beispiel ist eine Datenbanktransaktion. Beim Speichern einer Rechnung, einschließlich ihrer Kopfzeile und mehrerer Werbebuchungen, muss jeder einzelne Teil jeder einzelnen Datenbankzeile erfolgreich eingerichtet werden. Andernfalls gehen Daten verloren oder sind beschädigt. Wenn eine Werbebuchung nicht eingefügt werden kann, sollten nicht nur keine weiteren Zeilen eingefügt werden, sondern auch keine der bereits verarbeiteten Zeilen.

Thread-Sicherheit bezieht sich auf eine Kombination von Dingen, einschließlich Atomizität, die es einer Operation ermöglicht, "wiedereintrittsfähig" zu sein; Mehrere Mitarbeiter können dieselbe Operation zur gleichen oder zu unterschiedlichen Zeiten ausführen, ohne dass dies Auswirkungen auf andere hat. Es gibt viele Modelle für den thread-sicheren Betrieb. Die meisten von ihnen beschränken sich konzeptionell darauf, entweder mehrere parallele Aufgaben vollständig isoliert auszuführen (zwei Mitarbeiter können dieselbe Aufgabe für zwei verschiedene Objekte oder Objektsammlungen ausführen, ohne jemals zu wissen, dass der andere Mitarbeiter überhaupt existiert) oder eine "Pipeline" einzurichten, in der sie ausgeführt werden Mehrere Mitarbeiter führen jeweils eine Aufgabe aus einem gesamten Vorgang aus (entweder wechselt jeder Mitarbeiter von der ersten Aufgabe zur nächsten usw. oder er konzentriert sich auf eine Aufgabe und übergibt sein Zwischenprodukt "Arbeitsprodukt" an den nächsten Mitarbeiter).


2

Eine atomare Operation ist eine Operation, die nicht unterbrochen werden kann.

Ein sicherer Thread ist ein Thread, der sicher unterbrochen werden kann.

Thread-Sicherheit wird durch atomare Operationen erreicht, insbesondere in der Logik, die verhindert, dass auf kritische Ressourcen mehrmals zugegriffen wird.

Die grundlegende atomare Operation ist Test-and-Set , die zum Implementieren von Semaphoren verwendet wird, die wiederum zum Implementieren der Thread-Sicherheit verwendet werden.


Kann ein mehrstufiger Vorgang nicht unterbrochen und trotzdem als atomar bezeichnet werden, wenn garantiert wird, dass seine Änderungen rückgängig gemacht werden?
user50849

1
Nein. Atomic ist in seiner etymologischen Bedeutung zu verstehen: ἄτομος, atomos, unteilbar.
Mouviciel

Sind int, bool, float threadsicher oder atomar?
user960567

Aber ist nicht , dass es ein Unterschied zwischen Seinem indivisble und erscheinen unteilbar zu einem Beobachter ? Nach Ihrer Definition kann keine atomare Operation mehr als einen einzelnen Schritt enthalten. Ich glaube, dass das Wort "erscheint" in Wikipedia 'Definition der atomaren Operation wichtig ist. (Ich bin im Chat, wenn jemand es dort
hochbringen

Es gibt einen großen Unterschied: Ein sicherer Thread kann unterbrochen werden, und es gibt keine Garantie dafür, wie viel Zeit erforderlich ist. Dies ist beim Echtzeit-Computing von entscheidender Bedeutung. Es wird garantiert, dass eine atomare Operation (mit Interrupt-Sperren, wenn sie mehrstufig ist) nach einer vorhersehbaren Zeitspanne beendet wird.
Mouviciel

1

Thread-Sicherheit ist eher ein Framework oder ein "Konzept", atomare Operation ist eine Teilmenge, ein Mittel (eines von vielen), um den Status als "thread-sicher" zu erreichen.

Thread-Sicherheit bezieht sich auf einen Prozess, auf den über separate Threads zugegriffen werden kann, wobei der Zugriff auf einen (und die Manipulation von Daten) die Integrität des Betriebs des anderen nicht beeinträchtigt.

Ein Großteil der Fähigkeiten des Programmierers besteht darin, zu wissen, wie dies erreicht werden kann. Abhängig von der Situation und dem Hauptziel müssen Sie möglicherweise Folgendes implementieren: Sperren, Semaphoren, Latches, atomare Objekte, Synchronisationsregeln usw.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.