Uso de properties atómicas en el objective C: ¿efectos secundarios?

Entiendo que el significado de atomic se explicó en ¿Cuál es la diferencia entre los attributes atómicos y no atómicos? , pero lo que quiero saber es:

P. ¿Existen efectos secundarios, además de problemas de performance, en el uso de properties atómicas en todas partes?

Parece que la respuesta es no, ya que el performance del iPhone es bastante rápido hoy en día. Entonces, ¿por qué tantas personas siguen utilizando non-atomic ?

Incluso atomic no garantiza la security de los hilos, pero aún es mejor que nada, ¿verdad?

Incluso atómico no garantiza la security de los hilos, pero aún es mejor que nada, ¿verdad?

Equivocado Después de haber escrito algunos progtwigs concurrentes realmente complejos, recomiendo exactamente lo contrario . Debe reservar atomic para cuando realmente tenga sentido usarla, y es posible que no lo comprenda hasta que escriba progtwigs simultáneos sin utilizar atomic . Si estoy escribiendo un progtwig multiprocess, no deseo errores de progtwigción enmascarados (p. Ej., Condiciones de carrera). Quiero que los problemas de concurrency sean fuertes y obvios. De esta forma, son más fáciles de identificar, reproducir y corregir.

La creencia de que la security de algunos subprocesss es mejor que ninguno es errónea. El progtwig es thread safe o no lo es. Usar atomic puede hacer que esos aspectos de tus progtwigs sean más resistentes a los problemas relacionados con la concurrency, pero eso no te compensa mucho. Claro, es probable que haya less lockings, pero el progtwig sigue siendo indiscutiblemente incorrecto, y aún explotará de manera misteriosa. Mi consejo: si no vas a tomarte el time para aprender y escribir progtwigs concurrentes correctos , simplemente manténgalos en un solo subprocess (si eso suena un poco duro: no está destinado a ser severo, te salvará de muchos dolores de cabeza ) La subprocesamiento múltiple y la concurrency son temas enormes y complicados: se necesita mucho time para aprender a escribir progtwigs realmente correctos y de larga duración en muchos dominios.

Por supuesto, atomic puede usarse para lograr security de hilos en algunos casos, pero hacer que cada acceso atómico no garantice nada para la security de los hilos. Además, es altamente inusual (estadísticamente) que atomic properties atomic solo harán que la class sea realmente segura, en particular a medida que aumenta la complejidad de la class; es más probable que una class con un ivar sea realmente segura usando únicamente atómica, frente a una class con 5 ivars. atomic properties atomic son una function que uso muy pocas veces (de nuevo, algunas bases de código bastante grandes y progtwigs simultáneos). Es prácticamente un caso raro si las atmósferas son lo que hace que una class realmente resulte segura.

La complejidad del performance y la ejecución son las principales razones para evitarlos. En comparación con los accesos no atómicos, y la frecuencia y la simplicidad de acceder a una variable, el uso de la sum atómica aumenta muy rápido. Es decir, los accesos atómicos introducen una gran complejidad de ejecución en relación con la tarea que realizan.

Los lockings de giro son una forma en que se implementan las properties atómicas. Entonces, ¿querría una primitiva de synchronization, como un locking de giro o mutex, que rodea implícitamente cada get y set, sabiendo que no garantiza la security de los hilos? ¡Ciertamente no lo hago! Hacer que cada propiedad tenga acceso en sus implementaciones atómicas puede consumir una tonelada de time de CPU. Debe usarlo solo cuando tenga una razón explícita para hacerlo (también mencionado por dasblinkenlicht + 1). Detalle de implementación: algunos accesos no requieren cerraduras de giro para mantener las garantías de atomic ; Depende de varias cosas, como la architecture y el tamaño de una variable.

Entonces, para responder a su pregunta "¿algún efecto secundario?" en un formatting TL: DR: el performance es la razón principal que observaste, mientras que la aplicabilidad de las garantías atómicas y cómo te resulta útil es muy estrecha en tu nivel de abstracción (a menudo mal entendido) y enmascara errores reales .

No debe pagar por lo que no usa. A diferencia de las computadoras enchufadas en las que los ciclos de CPU le cuestan en términos de time, los ciclos de la CPU en un dispositivo mobile le cuestan tanto en el time como en el uso de la batería. Si su aplicación es de un solo subprocess, no hay razón para usar atomic , ya que las operaciones de locking y deslocking serían una pérdida de time y de batería. La batería es más importante que el time: mientras que la latencia asociada con la adición de operaciones adicionales puede ser invisible para el usuario final, los ciclos gastados networkingucirán el time que el dispositivo mobile puede funcionar después de una sola carga, una medida que muchos Los usuarios consideran muy importante.