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?
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?
Antworten:
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.
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).
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.
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.