¿Por qué escribir en una estructura de 24 bits no es atómico (cuando parece que escribir en una estructura de 32 bits lo es)?

Soy un ingeniero, de eso no hay duda. Por esta razón (y muy poco más allá de eso), recientemente hice un pequeño experimento para confirmar mi sospecha de que escribir a unstruct no es una operación atómica, quemedio que un tipo de valor llamado "inmutable" que intenta imponer ciertas restricciones podría hipotéticamente fallar en su objetivo.

escribíuna publicación de blog sobre esto usando el siguiente tipo como ilustración:

struct SolidStruct
{
    public SolidStruct(int value)
    {
        X = Y = Z = value;
    }

    public readonly int X;
    public readonly int Y;
    public readonly int Z;
}

Mientras que lo anteriorse ve como un tipo para el que nunca podría ser cierto queX != Y oY != Zde hecho estopuede sucederá si un valor está "a mitad de asignación" al mismo tiempo que se copia en otra ubicación por un hilo separado.

OK, gran cosa. Una curiosidad y poco más. Pero luego tuve esta corazonada: mi CPU de 64 bitsdebería en realidad ser capaz de copiar 64 bits atómicamente, ¿verdad? ¿Y qué si me deshago deZ y solo pegado conX yY? Eso es solo 64 bits; Debería ser posible sobrescribirlos en un solo paso.

Efectivamente, funcionó. (Me doy cuenta de que algunos de ustedes probablemente estén frunciendo el ceño en este momento, pensando,Si, duh ¿Cómo es esto incluso interesante? Humor conmigo.) Por supuesto, no tengo idea de si esto está garantizado o no dado mi sistema. No sé casi nada sobre registros, errores de caché, etc. (Literalmente solo regurgito términos que he escuchado sin comprender su significado); así que todo esto es una caja negra para mí en este momento.

Lo siguiente que probé, de nuevo, solo por una corazonada, fue una estructura que consta de 32 bits usando 2short campos. Esto también parecía exhibir "asignabilidad atómica". Peroentonces Intenté una estructura de 24 bits, usando 3byte campos:no vayas.

De repente, la estructura parecía ser susceptible a copias de "asignación media" una vez más.

Hasta 16 bits con 2byte campos: atómico de nuevo!

¿Podría alguien explicarme por qué es esto? He oído hablar de "empaquetado de bits", "separación entre líneas de caché", "alineación", etc., pero, una vez más, realmente no sé qué significa todo eso, ni si es relevante aquí. Pero yosensación como veo un patrón, sin poder decir exactamente qué es; La claridad sería muy apreciada.

Respuestas a la pregunta(4)

Su respuesta a la pregunta