Ero abituato a pensare che tutte le funzioni di rientro siano thread-safe. Ma ho letto Reentrancy page in Wiki, è messaggi Il codice che è "perfettamente rientrante, ma non thread-safe. Perché non garantisce il dato globale è in uno stato coerente durante l'esecuzione"Perché questo codice rientra, ma non è thread-safe
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);
}
non capisco la sua spiegazione . Perché questa funzione non è thread-safe? È perché la variabile globale int t
verrà modificata durante l'esecuzione dei thread?
Questo esempio è più che forzato. Ma, re-enterant e thread-safe sono concetti ortogonali. –
Posix ha un'altra definizione per la rientranza "In POSIX.1c, una" funzione di rientro "è definita come una" funzione il cui effetto, quando viene chiamato da due o più thread, è garantito come se i thread eseguissero la funzione una dopo l'altra in un ordine indefinito, anche se l'esecuzione effettiva è interlacciata ", che quell'esempio (abbastanza brutto) su wikipedia non sarebbe conforme allo – nos
Mi sembra che questo esempio non sia rientranti: l'interrotto' swap() 'sarebbe non scambiare i valori puntati da 'x' e' y' come previsto ('* y' potrebbe essere impostato su 2 qualunque sia il valore iniziale di' * x'). – rom1v