In Objective-C wird zwischen atomaren und nichtatomaren Eigenschaften unterschieden:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Nach meinem Verständnis können Sie Eigenschaften, die als atomar definiert sind, sicher aus mehreren Threads lesen und schreiben, während das gleichzeitige Schreiben und Zugreifen auf nichtatomare Eigenschaften oder ivars aus mehreren Threads zu undefiniertem Verhalten führen kann, einschließlich fehlerhafter Zugriffsfehler.
Wenn Sie also eine Variable wie diese in Swift haben:
var object: NSObject
Kann ich diese Variable sicher parallel lesen und schreiben? (Ohne die tatsächliche Bedeutung zu berücksichtigen).
objective-c
swift
lassej
quelle
quelle
@atomic
oder verwenden@nonatomic
. oder standardmäßig nur atomar. (Swift ist so unvollständig, wir können jetzt nicht viel sagen)atomic
es im Allgemeinen nicht als ausreichend für eine thread-sichere Interaktion mit einer Eigenschaft angesehen, außer für einfache Datentypen. Bei Objekten wird der Zugriff über Threads im Allgemeinen mithilfe von Sperren (z. B.NSLock
oder@synchronized
) oder GCD-Warteschlangen (z. B. serielle Warteschlange oder gleichzeitige Warteschlange mit dem Muster "Leser-Schreiber") synchronisiert .atomic
die Fadensicherheit für Objekte nicht gewährleistet; und (b) wenn man eine der oben genannten Synchronisationstechniken richtig verwendet, um die Thread-Sicherheit zu gewährleisten (unter anderem um gleichzeitiges Lesen / Schreiben zu verhindern), ist das atomare Problem umstritten. Aber wir brauchen / wollen es immer noch für einfache Datentypen, bei denen esatomic
einen echten Wert hat. Gute Frage!Antworten:
Es ist sehr früh anzunehmen, dass keine Dokumentation auf niedriger Ebene verfügbar ist, Sie jedoch von der Montage aus lernen können. Hopper Disassembler ist ein großartiges Werkzeug.
Verwendet
objc_storeStrong
undobjc_setProperty_atomic
für nichtatomare bzw. atomare, wobeiverwendet
swift_retain
vonlibswift_stdlib_core
und hat anscheinend keine eingebaute Thread-Sicherheit.Wir können spekulieren, dass später zusätzliche Schlüsselwörter (ähnlich wie
@lazy
) eingeführt werden könnten.Update 20.07.15 : Laut diesem Blogpost auf Singletons kann eine schnelle Umgebung bestimmte Fälle für Sie sicher machen, dh:
Update 25.05.16 : Halten Sie Ausschau nach dem Vorschlag für eine schnelle Entwicklung https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md - es sieht so aus Es wird möglich sein, das
@atomic
Verhalten selbst implementieren zu lassen.quelle
Swift hat keine Sprachkonstrukte zur Thread-Sicherheit. Es wird davon ausgegangen, dass Sie die bereitgestellten Bibliotheken verwenden, um Ihr eigenes Thread-Sicherheitsmanagement durchzuführen. Bei der Implementierung der Thread-Sicherheit stehen zahlreiche Optionen zur Verfügung, darunter pthread-Mutexe, NSLock und dispatch_sync als Mutex-Mechanismus. Siehe Mike Ashs jüngsten Beitrag zu diesem Thema: https://mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread-safety-and-swift.html Also die direkte Antwort auf Ihre Frage "Can Ich lese und schreibe sicher parallel zu dieser Variablen? " ist Nein.
quelle
Es ist wahrscheinlich zu früh, um diese Frage zu beantworten. Derzeit fehlen Swift Zugriffsmodifikatoren, sodass es keine offensichtliche Möglichkeit gibt, Code hinzuzufügen, der die Parallelität um einen Getter / Setter von Eigenschaften verwaltet. Darüber hinaus scheint die Swift-Sprache noch keine Informationen zur Parallelität zu haben! (Es fehlt auch KVO etc ...)
Ich denke, die Antwort auf diese Frage wird in zukünftigen Versionen klar.
quelle
willSet
,didSet
- scheint ein erster Schritt auf dem Weg zu seinEinzelheiten
Links
Implementierte Typen
Hauptidee
Beispiel für einen atomaren Zugang
Verwendung
Ergebnis
quelle
Atomic
Klasse und führen Sie sie mitAtomic().semaphoreSample()
Ab Swift 5.1 können Sie Eigenschafts-Wrapper verwenden , um eine spezifische Logik für Ihre Eigenschaften zu erstellen. Dies ist eine atomare Wrapper-Implementierung:
Wie benutzt man:
quelle
Hier ist der Wrapper für atomare Eigenschaften, den ich häufig verwende. Ich habe den eigentlichen Sperrmechanismus zu einem Protokoll gemacht, damit ich mit verschiedenen Mechanismen experimentieren kann. Ich habe Semaphoren ausprobiert
DispatchQueues
, und diepthread_rwlock_t
. Daspthread_rwlock_t
wurde ausgewählt, weil es den geringsten Overhead und eine geringere Wahrscheinlichkeit einer Prioritätsumkehr zu haben scheint.quelle