2017-02-20 19 views
3

Ich habe diese Frage bereits gesehen:
What's the difference between the atomic and nonatomic attributes?Wann ist @atomic zu verwenden?

ich, dass @atomic garantiert nicht, Thread sicher verstehen, und ich habe andere Mechanismen verwenden (z @synchronized), das zu realisieren. Basierend darauf weiß ich immer noch nicht GENAU wann @atomic Attribut zu verwenden. Ich würde gerne USE CASE von @atomic allein verwenden.

+1

Wenn Sie '@ atomic' sagen, meinen Sie, eine atomare Eigenschaft zu deklarieren (z. B.' @property (atomic, strong) NSString * string; ')? – Rob

+0

@Rob Ja, ich meine das. – tofucodes

Antwort

5

Der typische Anwendungsfall für atomic Eigenschaften ist, wenn es sich um einen primitiven Datentyp über mehrere Threads handelt. Angenommen, Sie haben einen Hintergrund-Thread, der eine Verarbeitung durchführt, und Sie haben eine BOOL-Statuseigenschaft, z. isProcessComplete und Ihr Hauptthread wollen, wenn der Hintergrund-Prozess abgeschlossen ist, um zu überprüfen: Um diese Eigenschaft zu erklären

if (self.isProcessComplete) { 
    // Do something 
} 

In diesem Fall, wie atomic wir/Update ohne komplizierteren Synchronisationsmechanismus diese Eigenschaft über mehrere Threads nutzen kann weil:

  • wir haben es mit einem skalaren, primitiven Datentyp zu tun, z BOOL;
  • haben wir es zu atomic erklärt; und
  • verwenden wir die Accessor-Methode (z. B. self.), anstatt direkt auf den ivar zuzugreifen.

Im Umgang mit Objekten oder anderen komplizierteren Situationen ist atomic im Allgemeinen nicht ausreichend. Wie Sie bemerken, reicht in der Praxis atomic allein nicht aus, um die Threadsicherheit zu erreichen, weshalb wir es nicht sehr oft verwenden. Aber für einfache, eigenständige, primitive Datentypen kann atomic eine einfache Möglichkeit sein, einen sicheren Zugriff über mehrere Threads hinweg zu gewährleisten.

+0

Tut "grundlegender Datentyp" bedeutet "primitive" Datentypen? – tofucodes

+0

Ich meine skalare C-Datentypen, diese primitiven Datentypen, die aus einem einzelnen Wert bestehen oder enums mit einem dieser Typen. Ich meine, Verbund- oder Referenztypen wie Objekte ausschließen, C-Arrays und C-Structures. – Rob

+0

bekam es! Vielen Dank für Ihre Antwort – tofucodes

1

@atomic wird Ihnen garantieren, dass der Wert, den Sie erhalten, kein Kauderwelsch ist. Eine mögliche Situation besteht darin, einen gegebenen Wert von einem Thread zu lesen und seinen Wert von einem anderen zu setzen. Dann stellt das Schlüsselwort @atomic sicher, dass Sie einen ganzen Wert erhalten. Wichtig ist, dass der Wert, den Sie erhalten, nicht der zuletzt eingestellte ist.

Der zweite Teil der Ihre Frage, über den Anwendungsfall ist rein umständlich, abhängig von der Umsetzung der Absichten. Wenn Sie z. B. jede Sekunde eine Art zeitbasiertes Update auf einer Liste haben, können Sie atomare verwenden, um sicherzustellen, dass Sie ganze Werte erhalten, und der Timer, der Ihre Liste aktualisiert, kann sicherstellen, dass Sie die neuesten Daten auf dem Bildschirm haben oder unter der Haube in irgendeiner impliziten Logik.

EDIT: Nach einer Bemerkung von @Rob sah ich die Notwendigkeit, den letzten Teil meiner Antwort zu paraphrasieren. In den meisten Fällen ist atomic nicht genug, um die Arbeit zu erledigen. Und es gibt eine bessere Lösung, wie @synchronized.

+5

Nur um zu verdeutlichen, das "der Wert ...Englisch: www.doc-o-matic.com/webhelp/AH_Edit...ng.html & la = de Ist bei einem fundamentalen Datentyp sinnvoll, aber wenn man sich mit einem Objekt beschäftigt, bedeutet es nur, dass der Zeiger auf das Objekt nicht Kauderwelsch ist, sondern gibt keine Zusicherung über den Zustand des Objekts Objekt ist veränderbar, dann "atomar" bietet wenig Nutzen. – Rob

+1

Mein Punkt war, dass "atomare" ist in den meisten Fällen nicht genug und Sie müssen einen anderen Weg verwenden, aber ich stimme völlig mit Ihnen überein, werde ich die Antwort bearbeiten. –