Codice rientrante
In informatica, il codice di un programma o di una routine è detto rientrante se è progettato in modo che un singola copia del codice in memoria può essere condivisa da utenti multipli o processi separati. La chiave per progettare codice rientrante è assicurarsi che nessuna porzione del codice possa essere alterata da un differente utente o processo, e che qualsiasi informazione specifica di un utente o processo sia mantenuta in un'area di memoria distinta.
La programmazione rientrante è vitale per molti sistemi multitasking (vedi thread-safe).
La parte di codice dei kernel che implementa la sincronizzazione interprocesso (semafori, sezioni critiche ecc.) non è rientrante per definizione.
Il kernel dei sistemi operativi Windows NT è completamente rientrante, a differenza di quello di Windows 9x, le cui notevoli porzioni di codice a 16 bit derivate da MS-DOS non sono rientranti. Pertanto l'accesso a codice di sistema a 16 bit in Windows 9x è regolato da una sezione critica globale, con il risultato che spesso il sistema operativo opera in maniera monotask.
Esempi
Nel frammento di codice che segue, entrambe le funzioni f() e g() non sono rientranti.
int g_var = 1;
int f()
{
g_var = g_var + 2;
return g_var;
}
int g()
{
return f () + 2;
}
La funzione f() dipende dalla variabile globale g_var; perciò, se due processi eseguono la funzione ed accedono a g_var simultaneamente, il risultato dipende dalle tempistiche di esecuzioni. Perciò, f() non è rientrante. Neppure g() è rientrante, perché richiama f() che non è rientrante.
Collegamenti esterni
- Articolo "Use reentrant functions for safer signal handling" di Dipak K. Jha (in lingua inglese).