Solía pensar que todas las funciones de reentrada son seguras para subprocesos. Pero leí Reentrancy page in Wiki, que Mensajes código que es "perfectamente reentrada, pero no apta para subprocesos. Porque no asegura los datos mundial se encuentra en un estado coherente durante la ejecución"Por qué este código es reentrante pero no es seguro para subprocesos
int t;
void swap(int *x, int *y)
{
int s;
s = t; // save global variable
t = *x;
*x = *y;
// hardware interrupt might invoke isr() here!
*y = t;
t = s; // restore global variable
}
void isr()
{
int x = 1, y = 2;
swap(&x, &y);
}
No entiendo su explicación . ¿Por qué esta función no es segura para subprocesos? ¿Es porque la variable global int t
se cambiará durante la ejecución de los hilos?
Este ejemplo es más que un poco artificial. Pero, re-enterant y thread-safe son conceptos ortogonales. –
Posix tiene otra definición para reentrada "En POSIX.1c, una" función de reentrada "se define como una" función cuyo efecto, cuando es invocado por dos o más hilos, se garantiza que todos los subprocesos ejecutan la función uno tras otro en un orden indefinido, incluso si la ejecución real está intercalada ", lo que (bastante mal) ejemplo en wikipedia no cumpliría con – nos
Me parece que este ejemplo no es reentrante: el' intercambio interrumpido() ' no intercambie los valores señalados por 'x' y' y' como se esperaba ('* y' podría establecerse en 2 cualquiera que sea el valor inicial de' * x'). – rom1v