Una pregunta rápida que me he estado preguntando por algún tiempo; ¿La CPU asigna valores atómicamente, o, es bit por bit (por ejemplo, un entero de 32 bits).
Si es poco a poco, ¿podría otro subproceso que accede a esta ubicación exacta obtener una "parte" del valor que se le asignará?¿Una CPU asigna un valor atómico a la memoria?
Piensa en esto:
Tengo dos hilos y una variable "unsigned int" compartida (llámala "g_uiVal").
Ambos subprocesos en bucle.
Activado está imprimiendo "g_uiVal" con printf ("% u \ n", g_uiVal).
El segundo solo aumenta este número.
¿El hilo de impresión alguna vez imprimirá algo que no sea totalmente o parte del valor de "g_uiVal"?
En código:
unsigned int g_uiVal;
void thread_writer()
{
g_uiVal++;
}
void thread_reader()
{
while(1)
printf("%u\n", g_uiVal);
}
¿Es posible acceder a los valores de 32 bits que cruzan las líneas de caché en estos días? –
@Lasse: muchos procesadores de escritorio modernos permiten lecturas y escrituras desalineadas, pero con una importante penalización de rendimiento. Las CPU antiguas o más pequeñas (por ejemplo, dispositivos integrados) tienden a no hacerlo. Durante algún tiempo, esto se dividió entre procesadores CISC (tendidos para admitir lecturas y escrituras no alineadas) y procesadores RISC (no lo hicieron), pero las distinciones se difuminan aquí. – leander
Los microcontroladores de 8, 16 y 32 bits son comunes. En un AVR (con cargas de 8 bits y tiendas) es posible tener otro ISR (rutina de servicio de interrupción) u otro hilo (si está ejecutando un sistema operativo multitarea elegible) escribir parte de la variable (o simplemente leer parte del cambiar que hizo el hilo anterior). – nategoose