En Objective-C, vous avez une distinction entre les propriétés atomiques et non atomiques:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
D'après ce que je comprends, vous pouvez lire et écrire des propriétés définies comme atomiques à partir de plusieurs threads en toute sécurité, tandis que l'écriture et l'accès à des propriétés non atomiques ou à des ivars à partir de plusieurs threads en même temps peuvent entraîner un comportement non défini, y compris des erreurs d'accès.
Donc, si vous avez une variable comme celle-ci dans Swift:
var object: NSObject
Puis-je lire et écrire dans cette variable en parallèle en toute sécurité? (Sans considérer la signification réelle de cela).
objective-c
swift
Lassej
la source
la source
@atomic
ou@nonatomic
. ou juste atomique par défaut. (Swift est tellement incomplet, nous ne pouvons pas en dire beaucoup maintenant)atomic
n'est généralement pas considéré comme suffisant pour une interaction thread-safe avec une propriété, sauf pour les types de données simples. Pour les objets, on synchronise généralement l'accès à travers les threads en utilisant des verrous (par exemple,NSLock
ou@synchronized
) ou des files d'attente GCD (par exemple, une file d'attente série ou une file d'attente simultanée avec un modèle "lecteur-écrivain").atomic
n'assure pas la sécurité des threads pour les objets; et (b) si l'on utilise correctement l'une des techniques de synchronisation susmentionnées pour assurer la sécurité des threads (entre autres, empêcher les lectures / écritures simultanées), le problème atomique est sans objet. Mais nous en avons toujours besoin / le voulons pour les types de données simples, oùatomic
a une valeur réelle. Bonne question!Réponses:
Il est très tôt pour supposer qu'aucune documentation de bas niveau n'est disponible, mais vous pouvez étudier à partir de l'assemblage. Le désassembleur de trémie est un excellent outil.
Utilisations
objc_storeStrong
etobjc_setProperty_atomic
pour non atomique et atomique respectivement, oùutilise
swift_retain
delibswift_stdlib_core
et, apparemment, n'a pas de sécurité des threads intégrée.Nous pouvons supposer que des mots clés supplémentaires (similaires à
@lazy
) pourraient être introduits plus tard.Mise à jour 20/07/15 : selon cet article de blog sur les singletons, l' environnement rapide peut rendre certains cas thread-safe pour vous, à savoir:
Mise à jour 25/05/16 : Gardez un œil sur la proposition d'évolution rapide https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md - on dirait que c'est va être possible d'avoir un
@atomic
comportement mis en œuvre par vous-même.la source
Swift n'a pas de construction de langage autour de la sécurité des threads. Il est supposé que vous utiliserez les bibliothèques fournies pour faire votre propre gestion de la sécurité des threads. Il existe un grand nombre d'options pour implémenter la sécurité des threads, y compris les mutex pthread, NSLock et dispatch_sync en tant que mécanisme de mutex. Voir le récent post de Mike Ash sur le sujet: https://mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread-safety-and-swift.html Donc, la réponse directe à votre question de "Can Je lis et j'écris cette variable en parallèle en toute sécurité? " est non.
la source
Il est probablement trop tôt pour répondre à cette question. Actuellement, swift manque de modificateurs d'accès, il n'y a donc pas de moyen évident d'ajouter du code qui gère la concurrence autour d'un getter / setter de propriétés. De plus, le langage Swift ne semble pas encore avoir d'informations sur la concurrence! (Il manque aussi KVO etc ...)
Je pense que la réponse à cette question deviendra claire dans les prochaines versions.
la source
willSet
,didSet
- semble être un premier pas sur le cheminDétails
Liens
Types mis en œuvre
Idée principale
Exemple d'accès atomique
Usage
Résultat
la source
Atomic
classe et exécutez-la en utilisantAtomic().semaphoreSample()
Voici le wrapper de propriété atomique que j'utilise beaucoup. J'ai fait du véritable mécanisme de verrouillage un protocole, afin que je puisse expérimenter différents mécanismes. J'ai essayé les sémaphores
DispatchQueues
, et lepthread_rwlock_t
. Le apthread_rwlock_t
été choisi car il semble avoir le surcoût le plus bas et une moindre chance d'inversion de priorité.la source
Depuis Swift 5.1, vous pouvez utiliser des wrappers de propriétés pour créer une logique spécifique pour vos propriétés. Ceci est l'implémentation du wrapper atomique:
Comment utiliser:
la source