El C# estados de especificaciones en la sección 5.5 que lee y escribe en ciertos tipos (es decir, bool
, char
, byte
, sbyte
, short
, ushort
, uint
, int
, float
, y los tipos de referencia) están garantizados para ser atómica.¿Cómo garantiza C# la atomicidad de las operaciones de lectura/escritura?
Esto ha despertado mi interés. Como puedes hacer eso? Quiero decir, mi humilde experiencia personal solo me mostró bloquear variables o usar barreras si quería que las lecturas y escrituras se vieran atómicas; eso sería un asesino de rendimiento si tuviera que hacerse para cada lectura/escritura. Y sin embargo C# hace algo con un efecto similar.
Quizás otros idiomas (como Java) lo hagan. En serio, no lo sé. Mi pregunta no tiene la intención de ser específica de un idioma, es solo que sé que C# lo hace.
Entiendo que podría tener que lidiar con ciertas instrucciones específicas del procesador, y puede no ser utilizable en C/C++. Sin embargo, aún me gustaría saber cómo funciona.
[EDIT] Para decir la verdad, creía que las lecturas y escrituras podrían ser no atómicas en ciertas condiciones, como que una CPU podría acceder a una ubicación de memoria mientras otra CPU escribe allí. ¿Esto solo ocurre cuando la CPU no puede tratar todo el objeto a la vez, como porque es demasiado grande o porque la memoria no está alineada en el límite adecuado?
Para mí, en realidad suena claro y directo. – Dykam
Meh. De alguna manera pensé que era posible que otra secuencia de comandos accediera a una ubicación de memoria durante otra operación de escritura de la CPU, lo que ocasionaba resultados inconsistentes. ¿Estuve equivocado todo ese tiempo? – zneak
Hay muchos otros problemas aparte de lectura/escritura atómica. Los 2 hilos que operan con las mismas variables pueden conducir a resultados no deseados porque a menudo leen/modifican/escriben y no son atómicos. También hay problemas de visibilidad de memoria en máquinas multiprocesador que necesitan cuidados especiales – nos