atomic vs performSelectorOnMainThread

  • atomic vs performSelectorOnMainThread

    Bin gerade am optimieren einer lade-Methode, und weil ich mich mit den atomic properties noch nie tief genug beschäftigt habe ist jetzt wohl der richtige Zeitpunkt. :)

    Ich parse (mehrere) CSV files auf einem eigenen Thread. Je nach einem Wert der CSV Zeile gehört diese Zeile zum einten oder anderen Objekt; diese Objekte werden erstellt, sobald sie das erste mal benötigt werden, und in einem NSMutableArray (Instanzvariable) gesammelt. Damit ich nicht zweimal dasselbe Objekt erstelle füge ich neue Objekte dem Array mittels performSelectorOnMainThread:withObject:waitUntilDone: hinzu und warte sogar, bis das geschehen ist. Klappt soweit bestens.

    Nun die Frage: Könnte ich diesen NSMutableArray einfach als atomic property definieren und dann ohne performSelectorOnMainThread arbeiten? D.h. ich könnte dann [self.myMutableArray addObject:xy] aufrufen und alles wird gut? :)
    Und wie sieht es performance-mässig aus?

    Danke schonmal.


    Edit:
    Dass "atomic" nicht gleich "thread-safe" bedeutet hab ich verstanden, hier geht es ja aber bloss um einen Thread (zumindest zu dem Zeitpunkt)... wobei, muss ich mir dabei überhaupt Sorgen machen? Da ich die Objekte im selben Thread (nur halt nicht im Main Thread) auslese und einfüge, könnte ich doch eigentlich... einfach ohne atomic und ohne performSelectorOnMainThread arbeiten... oder?

    Anders wärs wohl wenn ich nochmal alle die CSV files auf ihrem eigenen Thread parsen lassen würde. Also ein eigener Thread, welcher die Files auf wieder andere verteilt... hey, das könnte ich sogar machen. Dann muss ich aber mit performSelectorOnMainThread arbeiten, wenn ich da richtig durchblicke. Oder?

    Fragen über Frage... :)
    Widgetschmie.de • Life is too short for gadgets
  • RE: atomic vs performSelectorOnMainThread

    In der Tat habe ich mich zunächst gefragt, was du überhaupt damit willst. Ich habe mindestens 15234 Mal nachgelesen, dass du wirklich nur einen Thread hast.

    Wenn du mehrere hast, dann musst du ohnehin mit Locking (NSLock et al., @synchronized) arbeiten. Dann bringt atomic einfach nichts. Es gibt allerdings einen Unterschied, der nichts mit Threads zu tun hat:

    Quellcode

    1. Person* person = self.person;
    2. NSString* name = [person name];
    3. self.person = nil;
    4. // name ist mit nonatomic möglicherweise ungültig
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ok, ich war da wohl etwas verwirrt, weil ich immer im Hinterkopf hatte die Files parallel auf eigenen Threads zu parsen, das aber gar nicht gemacht habe. performSelectorOnMainThread brauchts da ja eh nicht, danke für den Pointer (hehe); atomic brauch ich hier auch nicht und nützt für thread-safe Sachen also auch nichts. Werd ich mir wohl NSLocking mal zu Gemüte führen.

    Amin, wieso ist in deinem Beispiel name mit nonatomic evtl. ungültig? Wäre der mit atomic denn noch gültig?
    Widgetschmie.de • Life is too short for gadgets
  • Es wird ungültig, wenn person freigegeben wird und im -dealloc name löscht. Die lokale Variable hält ja keine Referenz. Wenn man atomic verwendet, werden retain- und autorelease-Nachrichten geschickt, die das ganze in den ARP stopfen. Eigentlich dient das dazu, dass in dem ARP des Threads zu halten, da du ja nicht wissen kannst, ob in dem anderen Thread Person gelöscht wird. Es hilft aber auch bei diesem – allerdings nahe liegenden – Fehler.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ah, ok. Ich hätte meine Frage umgekehrt stellen sollen, dass name ungültig wird ist klar, aber dass er eben NICHT ungültig wird, wenn person (oder name) atomic ist, das hat mich erstaunt.

    Wenn ich jetzt das self.person = nil nicht in derselben Methode, aber in einer anderen Methode auf einem anderen Thread aufrufe, dann wird name ja (nonatomic) logischerweise auch ungültig. Also geht atomic technisch so vor, dass es aus [person name] quasi ein [[[person name] retain] autorelease] macht?
    Widgetschmie.de • Life is too short for gadgets
  • Jetzt bin ich verwirrt, Apple empfieht atomic doch extra für multi-threaded environment!?

    Properties are atomic by default so that synthesized accessors provide robust access to properties in a multi-threaded environment—that is, the value returned from the getter or set via the setter is always fully retrieved or set regardless of what other threads are executing concurrently. For more details, see “Performance and Threading.”


    Edit: OK, habe noch etwas zu Ende gelesen, alles klar jetzt!
    Tom
    [url=http://www.osxwerk.de]osXwerk[/url]