En Objective-C tiene una distinción entre propiedades atómicas y no atómicas:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Según tengo entendido, puede leer y escribir propiedades definidas como atómicas de varios subprocesos de forma segura, mientras que escribir y acceder a propiedades no atómicas o ivars de varios subprocesos al mismo tiempo puede provocar un comportamiento indefinido, incluidos errores de acceso incorrecto.
Entonces, si tiene una variable como esta en Swift:
var object: NSObject
¿Puedo leer y escribir en esta variable en paralelo de forma segura? (Sin considerar el significado real de hacer esto).
objective-c
swift
lassej
fuente
fuente
@atomic
o@nonatomic
. o simplemente atómico por defecto. (Swift está tan incompleto que no podemos decir mucho ahora)atomic
generalmente no se considera suficiente para la interacción segura para subprocesos con una propiedad, excepto para tipos de datos simples. Para los objetos, generalmente se sincroniza el acceso a través de subprocesos utilizando bloqueos (p. Ej.,NSLock
O@synchronized
) o colas GCD (p. Ej., Cola en serie o cola simultánea con patrón "lector-escritor").atomic
no garantiza la seguridad de los subprocesos para los objetos; y (b) si uno usa correctamente una de las técnicas de sincronización mencionadas anteriormente para garantizar la seguridad de los subprocesos (entre otras cosas, evitando lecturas / escrituras simultáneas), el problema atómico es discutible. Pero todavía lo necesitamos / queremos para tipos de datos simples, dondeatomic
tiene un valor real. ¡Buena pregunta!Respuestas:
Es muy temprano para asumir que no hay documentación de bajo nivel disponible, pero puede estudiar desde el ensamblaje. El desensamblador de tolva es una gran herramienta.
Usos
objc_storeStrong
yobjc_setProperty_atomic
para atómicos y no atómicos respectivamente, dondeusa
swift_retain
desdelibswift_stdlib_core
y, aparentemente, no tiene seguridad para subprocesos incorporada.Podemos especular que más
@lazy
adelante podrían introducirse palabras clave adicionales (similares a ).Actualización 20/07/15 : de acuerdo con esta publicación de blog sobre singletons, el entorno rápido puede hacer que ciertos casos sean seguros para usted, es decir:
Actualización 25/05/16 : Esté atento a la propuesta de evolución rápida https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md - parece que lo es será posible que
@atomic
usted mismo implemente el comportamiento.fuente
Swift no tiene construcciones de lenguaje en torno a la seguridad de subprocesos. Se supone que utilizará las bibliotecas proporcionadas para realizar su propia gestión de seguridad de subprocesos. Hay una gran cantidad de opciones que tiene para implementar la seguridad de subprocesos, incluidos los mutex de pthread, NSLock y dispatch_sync como mecanismo de exclusión mutua. Consulte la publicación reciente de Mike Ash sobre el tema: https://mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread-safety-and-swift.html Entonces, la respuesta directa a su pregunta de "¿Puede ¿Leo y escribo en esta variable en paralelo de forma segura? " no es.
fuente
Probablemente sea demasiado pronto para responder a esta pregunta. Actualmente, Swift carece de modificadores de acceso, por lo que no hay una forma obvia de agregar código que gestione la concurrencia en torno a un captador / definidor de propiedades. Además, Swift Language todavía no parece tener información sobre la concurrencia. (También carece de KVO, etc.)
Creo que la respuesta a esta pregunta quedará clara en futuras versiones.
fuente
willSet
,didSet
- parece ser un primer paso en el caminoDetalles
Enlaces
Tipos implementados
Idea principal
Muestra de acceso atómico
Uso
Resultado
fuente
Atomic
clase y ejecútela usandoAtomic().semaphoreSample()
Desde Swift 5.1 puede utilizar envoltorios de propiedades para crear una lógica específica para sus propiedades. Esta es la implementación del contenedor atómico:
Cómo utilizar:
fuente
Aquí está el contenedor de propiedades atómicas que utilizo ampliamente. Hice un protocolo del mecanismo de bloqueo real, para poder experimentar con diferentes mecanismos. Probé con semáforos
DispatchQueues
, ypthread_rwlock_t
. Septhread_rwlock_t
eligió porque parece tener la sobrecarga más baja y una menor probabilidad de una inversión de prioridad.fuente