¿Diferencia entre operación atómica y seguridad de rosca?

10

De la discusión que he visto parece que la operación atómica y la seguridad de los hilos son lo mismo, pero mucha gente dice que son diferentes. ¿Alguien puede decirme la diferencia si hay una?

usuario960567
fuente
44
Las operaciones atómicas ayudarán a garantizar la seguridad de los hilos, pero ¿cómo podrían ser lo mismo ? Un "hilo" no es lo mismo que una "operación".
user50849

Respuestas:

11

Las operaciones atómicas son una forma de lograr la seguridad del subproceso, ya sea mediante el uso de algún tipo de bloqueos como Mutexes o semáforos que utilizan operaciones atómicas internamente o mediante la implementación de sincronización sin bloqueo mediante cercos atómicos y de memoria.

Por lo tanto, las operaciones atómicas en tipos de datos primitivos son una herramienta para lograr la seguridad de subprocesos, pero no garantizan la seguridad de subprocesos automáticamente porque normalmente tiene múltiples operaciones que dependen unas de otras. Debe asegurarse de que estas operaciones se realicen sin interrupción, por ejemplo, utilizando Mutexes.

Sí, escribir uno de estos tipos de datos atómicos en c # es seguro para subprocesos, pero eso no hace que la función que usa en subprocesos sea segura. Solo asegura que la escritura única se ejecute correctamente incluso si un segundo hilo accede a ella "al mismo tiempo". Sin embargo, la siguiente lectura del hilo actual no está garantizada para obtener el valor previamente escrito como un hilo diferente podría haberlo escrito, solo que el valor leído es válido.

Archy
fuente
¿Int, bool, float son seguros para los hilos o atómicos?
user960567
1
@ user960567 - los tipos de datos son solo eso: tipos de datos. Depende del compilador decidir cómo acceder a ellos. Piense en un int64 en una CPU 8086.
mouviciel
2
En C # específicamente, que la pregunta está etiquetada, las lecturas y escrituras deben ser atómicas en los tipos de datos básicos. Ver Ecma 334
user50849
2
Y sí, escribir uno de estos tipos de datos atómicos en c # es seguro para subprocesos, pero eso no hace que la función que usa en subprocesos sea segura. Solo asegura que la escritura única se ejecute correctamente incluso si un segundo hilo accede a ella "al mismo tiempo". Sin embargo, la siguiente lectura del hilo actual no está garantizada para obtener el valor previamente escrito como un hilo diferente podría haberlo escrito, solo que el valor leído es válido.
Archy
44
x = 5 es atómico en c #. Pero inmediatamente después de esta operación, podría sobrescribirse. x = x + 1 se ejecuta cargando 1. x en el registro 2. incremente x en el registro 3. almacene x en la memoria. Si un segundo subproceso hace lo mismo al mismo tiempo, ambos cargarán el mismo valor, lo incrementarán y lo almacenarán, lo que dará como resultado que x solo se incremente una vez en lugar de dos veces. InterlockedIncrement utiliza una instrucción de procesador especial para ejecutar un incremento atómico o lo garantiza mediante un mecanismo de bloqueo, por ejemplo, CAS, para garantizar que mientras el nuevo valor no se escriba, ningún otro hilo pueda leer el valor anterior.
Archy
3

La atomicidad y la seguridad del hilo son dos cosas diferentes. La atomicidad se refiere a la calidad de "todo o nada" de una operación; Si una operación no se puede realizar con éxito al 100%, el sistema debe permanecer en el estado general en el que se encontraba antes de que comenzara cualquier parte de la operación. El ejemplo clásico es una transacción de base de datos; Al guardar una factura, incluido su encabezado y varias líneas de pedido, cada parte de cada fila de la base de datos debe colocarse correctamente; si no, los datos se pierden o se corrompen. Si no se puede insertar una línea de pedido, no solo se deben insertar otras filas restantes, sino que ninguna de las filas ya procesadas debe permanecer.

La seguridad de subprocesos se refiere a una combinación de cosas, incluida la atomicidad, que permite que una operación sea "reentrante"; varios trabajadores pueden realizar la misma operación, comenzando en el mismo momento o en diferentes momentos, sin efecto en ningún otro. Hay muchos modelos para una operación segura para subprocesos; la mayoría de ellos se reducen conceptualmente a ejecutar múltiples tareas paralelas en completo aislamiento (dos trabajadores pueden realizar la misma tarea en dos objetos diferentes o colecciones de objetos sin siquiera saber que el otro trabajador existe), o establecer una "tubería" dentro de la cual varios trabajadores realizan una tarea de una operación completa (o bien cada trabajador progresa de la primera tarea a la siguiente y así sucesivamente, o bien se enfoca en una tarea y entrega su "producto de trabajo" intermedio al siguiente trabajador).

KeithS
fuente
2

Una operación atómica es una operación que no puede ser interrumpida.

Un subproceso seguro es un subproceso que se puede interrumpir de forma segura.

La seguridad de subprocesos se obtiene con operaciones atómicas, en particular en la lógica que evita que se acceda a recursos críticos varias veces.

La operación atómica básica es Test-and-set , que se usa para implementar semáforos, que a su vez se usan para implementar seguridad de subprocesos.

Mouviciel
fuente
¿No se puede interrumpir una operación de varios pasos y seguir llamándose atómica si se garantiza que revierta sus cambios?
user50849
1
No. Atómico debe entenderse en su significado etimológico: ἄτομος, atomos, indivisible.
mouviciel
¿Int, bool, float son seguros para los hilos o atómicos?
user960567
Pero, ¿no hay una diferencia entre ser indivisible y parecer indivisible para un observador ? Según su definición, ninguna operación atómica podría contener más de un solo paso. Creo que la palabra "aparece" en la definición de Wikipedia de funcionamiento atómico es importante. (Estoy en el chat si alguien quiere traerlo allí) :)
user50849
Hay una gran diferencia: se puede interrumpir un hilo seguro y no hay garantía de cuánto tiempo. Esto es crítico en la computación en tiempo real. Se garantiza que una operación atómica (con bloqueos de interrupción si es de varios pasos) termine después de un período de tiempo predecible.
mouviciel
1

La seguridad de subprocesos es más un marco o un "concepto", la operación atómica es un subconjunto, un medio (uno de muchos) para alcanzar el estado de clasificada como "segura para subprocesos".

La seguridad de subprocesos se refiere a un proceso al que se puede acceder mediante subprocesos separados, donde el acceso de uno (y la manipulación de datos) no corromperá la integridad de la operación del otro.

Gran parte de la habilidad del programador es saber cómo lograr esto, dependiendo de la situación y el objetivo clave, es posible que deba implementar, por ejemplo: bloqueos, semáforos, pestillos, objetos atómicos, reglas de sincronización, etc.

ADP
fuente