1951 Stimmen

Was ist der Unterschied zwischen den atomaren und nichtatomaren Attributen?

Was tun atomic y nonatomic in Eigenschaftserklärungen bedeuten?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Was ist der operative Unterschied zwischen diesen drei?

97voto

Durai Amuthan.H Punkte 30175

Atomic \= Gewindesicherheit

Nicht-atomar \= Keine Fadensicherheit

Gewindesicherheit:

Instanzvariablen sind thread-sicher, wenn sie sich korrekt verhalten, wenn von mehreren Threads aus auf sie zugegriffen wird, und zwar unabhängig von der Zeitplanung oder der Verschachtelung der Ausführung dieser Threads durch die Laufzeitumgebung und ohne zusätzliche Synchronisierung oder sonstige Koordinierung seitens des aufrufenden Codes.

In unserem Zusammenhang:

Wenn ein Thread den Wert der Instanz ändert, ist der geänderte Wert für alle Threads verfügbar, und nur ein Thread kann den Wert gleichzeitig ändern.

Wo zu verwenden atomic :

wenn auf die Instanzvariable in einer Multithreading-Umgebung zugegriffen werden soll.

Auswirkung von atomic :

Nicht so schnell wie nonatomic denn nonatomic erfordert keine Watchdog-Arbeit zur Laufzeit.

Wo zu verwenden nonatomic :

Wenn die Instanzvariable nicht von mehreren Threads geändert werden soll, können Sie sie verwenden. Es verbessert die Leistung.

5 Stimmen

Alles, was Sie hier sagen, ist richtig, aber der letzte Satz ist im Grunde "falsch", Dura, für die heutige Programmierung. Es ist wirklich unvorstellbar, dass Sie sich die Mühe machen, auf diese Weise zu versuchen, die Leistung zu "verbessern". (Ich meine, bevor man auch nur Lichtjahre davon entfernt wäre, würde man "ARC nicht verwenden", "NSString nicht verwenden, weil es langsam ist!" und so weiter). Um ein extremes Beispiel zu geben, wäre es so, als würde man sagen: "Team, keine Kommentare in den Code einfügen, denn das macht uns langsamer." Es gibt keine realistische Entwicklungspipeline, in der man die (nicht vorhandenen) theoretischen Leistungsgewinne um den Preis der Unzuverlässigkeit haben möchte.

3 Stimmen

@JoeBlow es ist eine Tatsache, die Sie hier nachprüfen können developer.apple.com/library/mac/documentation/Cocoa/Conceptual/

3 Stimmen

Durai, FWIW, das enlace widerspricht direkt Ihrer These "Atomic = Thread-Sicherheit". In der Dokumentation sagt Apple ausdrücklich: "Atomarität einer Eigenschaft ist nicht gleichbedeutend mit der Thread-Sicherheit eines Objekts." In der Praxis reicht Atomarität selten aus, um Thread-Sicherheit zu erreichen.

79voto

swiftBoy Punkte 34715

Nach der Lektüre so vieler Artikel, Stack Overflow-Beiträge und der Erstellung von Demo-Anwendungen zur Überprüfung der Attribute von Variableneigenschaften habe ich beschlossen, alle Informationen zu den Attributen zusammenzustellen:

  1. atomic // Standard
  2. nonatomic
  3. strong = retain // Standard
  4. weak = unsafe_unretained
  5. retain
  6. assign // Standard
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // Standard

In dem Artikel Variable Eigenschaftsattribute oder Modifikatoren in iOS finden Sie alle oben genannten Attribute, und das wird Ihnen auf jeden Fall helfen.

  1. atomic

    • atomic bedeutet, dass nur ein Thread auf die Variable zugreift (statischer Typ).
    • atomic ist thread-sicher.
    • Aber es ist langsam in der Leistung
    • atomic ist das Standardverhalten
    • Atomare Accessoren in einer nicht Garbage-Collection-Umgebung (d.h. bei Verwendung von retain/release/autorelease) verwenden eine Sperre, um sicherzustellen, dass ein anderer Thread das korrekte Setzen/Gehen des Wertes nicht beeinträchtigt.
    • Es handelt sich nicht um ein Schlüsselwort.

    Beispiel:

        @property (retain) NSString *name;
    
        @synthesize name;
  2. nonatomic

    • nonatomic bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ).
    • nonatomic ist thread-unsicher.
    • Aber es ist schnell in der Leistung
    • nonatomic ist NICHT das Standardverhalten. Wir müssen die nonatomic Schlüsselwort im Attribut property.
    • Es kann zu unerwartetem Verhalten führen, wenn zwei verschiedene Prozesse (Threads) gleichzeitig auf dieselbe Variable zugreifen.

    Beispiel:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;

0 Stimmen

Wie können Zuweisung und stark/beibehalten beide Standard sein?

0 Stimmen

Stark kommt mit ARC, Beibehaltung war Standard vor ARC

70voto

tipycalFlow Punkte 7554

Ich habe eine ziemlich gut formulierte Erklärung der atomaren und nicht-atomaren Eigenschaften gefunden ici . Hier ist ein relevanter Text aus demselben:

Atomar" bedeutet, dass es nicht abgebaut werden kann. In Bezug auf Betriebssysteme/Programmierung ist ein atomarer Funktionsaufruf einer, der nicht unterbrochen werden kann - die gesamte Funktion muss ausgeführt werden und darf nicht durch die übliche Kontextumschaltung des Betriebssystems aus der CPU ausgelagert werden, bis sie abgeschlossen ist. Nur für den Fall, dass Sie es nicht wussten: Da die CPU nur eine Sache auf einmal tun kann, verteilt das Betriebssystem den Zugriff auf die CPU in kleinen Zeitscheiben an alle laufenden Prozesse, um die Illusion des Multitasking. Der CPU-Scheduler kann einen Prozess an jedem Punkt seiner Ausführung unterbrechen (und tut dies auch) - sogar mitten in einem Funktionsaufruf. Daher müssen Aktionen wie die Aktualisierung von gemeinsam genutzten Zählervariablen, bei denen zwei Prozesse versuchen könnten, die Variable gleichzeitig zu aktualisieren, "atomar" ausgeführt werden, d. h. jede Aktualisierungsaktion muss vollständig abgeschlossen sein, bevor ein anderer Prozess auf die CPU geschaltet werden kann.

Ich würde also vermuten, dass atomar in diesem Fall bedeutet, dass die Attribut-Leser-Methoden nicht unterbrochen werden können - in der Tat bedeutet, dass die Variable(n), die von der Methode gelesen werden, nicht ihren Wert auf halbem Weg ändern können, weil einige andere Thread/Aufruf/Funktion auf die CPU ausgelagert wird.

Weil die atomic Variablen nicht unterbrochen werden können, ist der in ihnen enthaltene Wert zu jedem Zeitpunkt garantiert (thread-lock) unverfälscht Allerdings verlangsamt sich der Zugriff auf sie, wenn diese Threadsperre gewährleistet ist. non-atomic Die Variablen hingegen bieten keine solche Garantie, aber den Luxus eines schnelleren Zugangs. Zusammenfassend lässt sich sagen, dass Sie mit non-atomic wenn Sie wissen, dass nicht mehrere Threads gleichzeitig auf Ihre Variablen zugreifen werden, und die Dinge beschleunigen.

1 Stimmen

Der Link ist defekt. ;(

1 Stimmen

Das ist das Problem mit Links :( Zum Glück habe ich den entsprechenden Text in meiner Antwort zitiert

63voto

Andrew Grant Punkte 57342

Atomare :

Atomic garantiert, dass der Zugriff auf die Eigenschaft auf atomare Weise erfolgt. So wird z. B. immer ein vollständig initialisiertes Objekt zurückgegeben, und jedes Get/Set einer Eigenschaft auf einem Thread muss abgeschlossen sein, bevor ein anderer darauf zugreifen kann.

Wenn Sie sich vorstellen, dass die folgende Funktion auf zwei Threads gleichzeitig abläuft, können Sie sehen, warum die Ergebnisse nicht schön sind.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

Vorteile: Da jedes Mal vollständig initialisierte Objekte zurückgegeben werden, ist es die beste Wahl im Falle von Multithreading.

Nachteile: Leistungseinbußen, die Ausführung wird etwas langsamer

Nicht-Atomisch :

Im Gegensatz zu Atomic wird nicht jedes Mal ein vollständig initialisiertes Objekt zurückgegeben.

Vorteile: Äußerst schnelle Ausführung.

Nachteile: Wahrscheinlichkeit von Garbage Value im Falle von Multi-Threading.

5 Stimmen

Dieser Kommentar ergibt nicht viel Sinn. Können Sie das klären? Wenn Sie sich die Beispiele auf der Apple-Website ansehen, dann synchronisiert das atomare Schlüsselwort das Objekt, während seine Eigenschaften aktualisiert werden.

53voto

Jay O'Conor Punkte 2475

Die einfachste Antwort zuerst: Es gibt keinen Unterschied zwischen Ihren zweiten beiden Beispielen. Standardmäßig sind Property Accessors atomar.

Atomare Accessoren in einer nicht Garbage-Collection-Umgebung (d.h. bei Verwendung von retain/release/autorelease) verwenden eine Sperre, um sicherzustellen, dass ein anderer Thread das korrekte Setzen/Gehen des Wertes nicht beeinträchtigt.

Siehe die " Leistung und Threading "Abschnitt der Objective-C 2.0-Dokumentation von Apple für weitere Informationen und für andere Überlegungen bei der Erstellung von Multi-Thread-Anwendungen.

8 Stimmen

Aus zwei Gründen. Erstens erzeugt er bei synthetisiertem Code schneller (aber nicht thread-sicher). Zweitens, wenn Sie Kunden-Accessors schreiben, die nicht atomar sind, können Sie für jeden zukünftigen Benutzer vermerken, dass der Code nicht atomar ist, wenn sie seine Schnittstelle lesen, ohne dass sie implementiert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X