web-dev-qa-db-de.com

Atomare Eigenschaften im Vergleich zu Thread-Safe in Objective-C

In den meisten Diskussionen, die ich gelesen habe, bedeutet dies, dass das Erstellen einer Eigenschaft Atomic nicht garantiert, dass es Thread-sicher ist. Es wird lediglich sichergestellt, dass der zurückgegebene Wert nicht als Abfall gilt, wenn ein Objekt in ein anderes Objekt geschrieben wird versuchen, es gleichzeitig zu lesen.

Ich verstehe, dass dies nicht fadensicher ist, da ein drittes Objekt es schreiben könnte und obwohl das Objekt, auf das zugegriffen wird, keinen Müll zurückbekommt, ist es nicht ganz sicher, welchen Wert es zurückbekommt, wenn mehrere Objekte gleichzeitig darauf schreiben Zeit, und es kann einen ihrer Werte erhalten.

Wenn wir also sagen, dass es keinen Müll zurückgibt, wäre Müll in dem Sinne, dass ein Objekt, wenn es nicht atomar ist und versucht, auf den Objektzugriff zuzugreifen, während ein anderer darauf schreibt, das Ergebnis möglicherweise zurückschreibt, und nur eine unvollständige Version der durch das Schreiben hervorgerufenen Änderung erhalten? Bedeutet dies "Müll" in diesem Sinne und welche atomaren Eigenschaften helfen zu verhindern?

26
Doug Smith

Eine atomic-Eigenschaft in Objective C garantiert, dass Sie keine partiellen Schreibvorgänge sehen werden ..__ Wenn ein @property das Attribut atomic hat, ist es unmöglich, den Wert nur teilweise zu schreiben. Der Setter ist so:

- (void)setProp:(NSString *)newValue {
    [_prop lock];
    _prop = newValue;
    [_prop unlock];
}

Wenn also zwei Threads gleichzeitig den Wert @ "test" und @ "otherTest" schreiben möchten, dann kann die Eigenschaft zu jedem Zeitpunkt nur der Anfangswert der Eigenschaft oder @ "test" oder @ "sein. otherTest ".nonatomic ist schneller, aber der Wert ist ein Abfallwert und kein partieller String von @" test "/ @" "otherTest" (thx @Gavin) oder ein beliebiger anderer Abfallwert.

Aberatomic ist nur mit einfacher Verwendung fadensicher . Es ist nicht garantiert ..--. Appledoc sagt der folgende:

Stellen Sie sich ein XYZPerson-Objekt vor, in dem sowohl der erste als auch der letzte einer Person Namen werden mit atomaren Zugriffsmethoden aus einem Thread geändert. Wenn ein anderer Thread greift gleichzeitig auf beide Namen zu, die atomaren Getter-Methoden gibt vollständige Zeichenfolgen zurück (ohne abzustürzen), aber es gibt keine Stellen Sie sicher, dass diese Werte die richtigen Namen sind andere. Wenn vor der Änderung auf den Vornamen zugegriffen wird, jedoch auf den letzten Wenn nach der Änderung auf den Namen zugegriffen wird, erhalten Sie ein inkonsistentes Format nicht übereinstimmendes Namenspaar.

Ich hatte nie ein Problem mit Atomic. Ich habe den Code so entworfen, dass es keine Probleme mit den atomaren Eigenschaften gibt.

36
Binarian

Antwort auf deinen dritten Absatz; im Wesentlichen ja. Eine Ordnungszahl kann nicht gelesen werden, während ein Thread die Nummer schreibt.

Wenn ein Thread beispielsweise die ersten zwei Bytes einer atomaren 4-Byte-Nummer geschrieben hat und ein Lesevorgang dieser Nummer für einen anderen Thread angefordert wird, muss dieser Lesevorgang warten, bis alle vier Bytes geschrieben wurden.

Wenn ein Thread die ersten zwei Bytes einer nicht-atomaren 4-Byte-Nummer geschrieben hat und zu diesem Zeitpunkt ein Lesen dieser Nummer in einem anderen Thread angefordert wird, liest er umgekehrt die ersten beiden neuen Datenbytes, erhält jedoch alte Daten von einer vorherigen Schreiboperation in den anderen zwei Bytes.

5
Robert Harvey

Die Antwort von Robert Harvey ist richtig, aber es gibt einen Unterfall davon, dass die Leute oft vermisst werden. Beachten Sie diesen Code: http://Pastebin.com/S7XyJm6G

Die atomaren Eigenschaften verhindern nicht nur, dass Sie teilweise geschriebene Werte lesen, sondern auch, dass Sie Objekte zurückerhalten, von denen Sie nicht die Lebensdauer von kontrollieren. Dies ist wichtig für Single-Thread-Code wie das von mir verknüpfte Beispiel, aber noch wichtiger für Multithread-Code, bei dem ein anderer Thread dazu führen könnte, dass das Objekt unter Ihnen freigegeben wird.

3
Catfish_Man

Bei gleichzeitiger Programmierung:

atom bedeutet, wenn auf einen Eigenschaftswert, auf den in einem Thread (Thread # 1) und einem anderen Thread (Thread # 2) für den Schreibvorgang zugegriffen wird, versucht wird, auf den Atomwert entweder für den Lese- oder Schreibvorgang zuzugreifen, dann wartet der andere Thread (Thread # 2) bis zum Thread # 1 erledigt seine Aufgabe ..__ Mit anderen Worten: Atomic synchronisiert den Zugriff von Immobilien auf der Basis des First Come First Servs.

non-atomic bedeutet, wenn ein Eigenschaftswert, auf den für den Schreibvorgang in einem Thread (Thread # 1) und einem anderen Thread (Thread # 2) zugegriffen wird, versucht, auf den nicht-atomaren Wert für den Lese- oder Schreibvorgang zuzugreifen, wird der andere Thread (Thread # 2) abgerufen Wert erhält sofort alten Wert

0
Shashi3456643

Explizite Implementierung von 

@ property (atomar, keep) NSNumber * count

wäre so 

- (NSNumber *)count {
    NSNumber *count;
    @synchronized(self) {
        count = [_count retain]; // +1
    }
    return [count autorelease]; // delayed -1
}

- (void)setCount:(NSNumber *)count {
    id oldValue;
    @synchronized(self) {
        oldValue = _count;
        _count = [count retain];
    }
    [oldValue release];
}

Atomic ist das Standardverhalten einer Eigenschaft. Eine Atomic-Eigenschaft erhöht die Thread-Sicherheit beim Abrufen oder Festlegen von Werten. Das heißt, der Getter und Setter für die Eigenschaft wird immer vollständig abgeschlossen, unabhängig davon, was andere Threads tun. Für diese Eigenschaften ist der Zugriff etwas langsamer als für ein nichtatomares Äquivalent.

Und explizit würden wir implementieren 

@ property (nonatomic, keep) NSNumber * count

so was

- (NSNumber *)count {
    return _count;
}

- (void)setCount:(NSNumber *)count {
    if (count != _count) {
        id oldValue = _count;
        _count = [count retain];
        [_oldValue release];
    }
}

Nichtatomare Eigenschaften sind nicht threadsicher und geben ihre Eigenschaften direkt zurück. Dies ist schneller als atomare Eigenschaften, birgt jedoch offensichtlich ein gewisses Risiko, wenn keine Vorsichtsmaßnahmen getroffen werden.

setter & Getter für diese nichtatomische Eigenschaft

0
Suraj K Thomas