¿Qué significa la propiedad "no atómica"?


144

¿Qué significa "no atómico" en este código?

@property(nonatomic, retain) UITextField *theUsersName;

¿Cuál es la diferencia entre atomic y nonatomic?

Gracias


3
Lo sentimos, olvidé especificar esto en Objective-c (cacao)


Para cualquiera que lea esto, para 2014 es importante darse cuenta de que mucha de esta información está muy desactualizada. En una palabra, no hay ninguna razón para usar no atómico y es esencialmente incorrecto usarlo, por alguna razón. Es historia antigua. No atómico significa "modo inseguro de subprocesos" y es (en una palabra) ahora totalmente irrelevante. Algunos comentarios aquí stackoverflow.com/q/23977765/294884
Fattie

No estaría de acuerdo con la declaración "no relevante". Si el valor cambia Raramente y como el ejemplo en Apple doc es el apellido. Cambia una vez y luego usar una pista atómica es un desperdicio de recursos involucrados, ya que los controles no son necesarios.
Nick Turner

Respuestas:


268

Echa un vistazo a los documentos de Apple .

Básicamente, si usted dice nonatomic, y genera los accesos usando @synthesize, entonces si múltiples hilos intentan cambiar / leer la propiedad a la vez, puede ocurrir algo malo. Puede obtener valores parcialmente escritos u objetos sobre liberados / retenidos, lo que puede provocar fácilmente bloqueos. (Sin embargo, esto es potencialmente mucho más rápido que un accesor atómico).

Si usa el valor predeterminado (que es atomic; antes no había una palabra clave para esto, pero ahora sí ), entonces los @synthesizemétodos d usan un bloqueo de nivel de objeto para garantizar que se serialicen múltiples lecturas / escrituras en una sola propiedad. Como señalan los documentos de Apple, esto no significa que todo el objeto sea seguro para subprocesos , pero las propiedades individuales de lectura / escritura sí lo son.

Por supuesto, si implementa sus propios accesos en lugar de usarlos @synthesize, creo que estas declaraciones no hacen nada excepto expresar su intención de si la propiedad se implementa de manera segura.


77
Me gusta esta respuesta: ¡menos confusa, más simple y más completa que las que se encuentran en otros lugares!
PapillonUK

Realmente genial y menos confuso (+1), pero ¿podría decir por qué potencialmente no atómico es mucho más rápido que un accesor atómico?
Deseo

2
@Wish Los accesores no atómicos pueden ser más rápidos porque para evitar que otros hilos lean / escriban al mismo tiempo, debe mantener un mutex o hacer otros trucos de bajo nivel que cuestan tiempo de CPU. Si está usando un bloqueo, también puede terminar bloqueando otros hilos, lo que también lleva tiempo.
Jesse Rusak

1
@Rob Es posible que desee hacer una nueva pregunta al respecto.
Jesse Rusak

1
@Pratik Lo siento, eso no es correcto. La cita que muestra dice exactamente lo mismo que hice: que hacer una propiedad atomicevita bloqueos al acceder a propiedades individuales pero no garantiza que el objeto en su conjunto (es decir, acceder a propiedades separadas como el nombre y los apellidos) va a hacer Lo correcto.
Jesse Rusak

46

Después de leer tantos artículos y publicaciones de StackOverflow, y haber creado aplicaciones de demostración para verificar los atributos de propiedad Variable, decidí reunir toda la información de los atributos

  1. atómico // predeterminado
  2. no atómico
  3. fuerte = retener // predeterminado
  4. débil = inseguro_reretenido
  5. conservar
  6. asignar // predeterminado
  7. inseguro_retendido
  8. Copiar
  9. solo lectura
  10. readwrite // predeterminado

así que a continuación se encuentra el enlace detallado del artículo donde puede encontrar todos los atributos mencionados anteriormente, que definitivamente lo ayudarán. ¡Muchas gracias a todas las personas que dan las mejores respuestas aquí!

Atributos de propiedad variable o modificadores en iOS

  1. atómico
    • Atómico significa que solo un hilo accede a la variable (tipo estático).
    • Atomic es seguro para subprocesos.
    • Pero es lento en rendimiento.
    • Atómico es el comportamiento predeterminado.
    • Los accesores atómicos en un entorno sin recolección de basura (es decir, cuando se usa retención / liberación / liberación automática) usarán un bloqueo para garantizar que otro hilo no interfiera con la configuración / obtención correcta del valor.
    • en realidad no es una palabra clave

Ejemplo:

@property (retain) NSString *name;

@synthesize name;
  1. no atómico
    • No atómico significa acceso múltiple a la variable (tipo dinámico).
    • Nonatomic es un hilo inseguro.
    • Pero es rápido en rendimiento.
    • No atómico NO es un comportamiento predeterminado; necesitamos agregar una palabra clave no atómica en el atributo de propiedad.
    • puede provocar un comportamiento inesperado, cuando dos procesos diferentes (hilos) acceden a la misma variable al mismo tiempo.

Ejemplo:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

Además de lo que ya se ha dicho sobre la seguridad de los hilos, las propiedades no atómicas son más rápidas que los accesores atómicos. No es algo de lo que deba preocuparse, pero tenga en cuenta. Las propiedades generadas por Core Data son parcialmente no atómicas por este motivo.


9

En un programa multiproceso, una operación atómica no puede interrumpirse parcialmente, mientras que las operaciones no atómicas sí.

Por lo tanto, debe usar mutexes (o algo así) si tiene una operación crítica que no es atómica y que no desea interrumpir.


8

Si especifica "atómico", las funciones de acceso generadas tienen algún código adicional para evitar actualizaciones simultáneas.



2

Puede obtener un control de estas cosas leyendo el siguiente artículo.

Roscado explicado con el propósito no atómico

no atómico: no es seguro para subprocesos

atomic - Thread Safe - Este es el atributo de propiedad predeterminado.


1
¿Estás seguro de que no es lo contrario? Las propiedades atómicas son seguras, pero las propiedades no atómicas no son seguras. La última vez que lo revisé fue así: P
David Rönnqvist

0

El "atómico" significa que el acceso a la propiedad es seguro para subprocesos, mientras que el "no atómico" es lo opuesto. Cuando declara una propiedad en Objective-C, la propiedad es atómica por defecto, de modo que los accesos sintetizados proporcionan un acceso robusto a la propiedad en un entorno multiproceso, es decir, el valor devuelto por el getter o establecido a través del setter siempre se recupera o establece por completo independientemente de lo que otros subprocesos se ejecuten simultáneamente, pero si declara la propiedad como no atómica como se muestra a continuación

@property (nonatomic, retain)  NSString *myString;

entonces significa que un descriptor de acceso sintetizado para una propiedad de objeto simplemente devuelve el valor directamente. El efecto del atributo no atómico depende del entorno. Por defecto, los accesos sintetizados son atómicos. Entonces no atómico es considerablemente más rápido que atómico.


-2

Uno es para hilos múltiples. Uno no


En mi humilde opinión: Para obtener votos a favor, debe ser más específico y dedicar un tiempo a escribir su respuesta.
Johan Karlsson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.