Reintrare

Un program de calculator în ansamblu sau procedura sa separată se numește reintrant dacă  este proiectat în așa fel încât aceeași copie a instrucțiunilor programului din memorie să poată fi partajată de mai mulți utilizatori sau procese. În același timp, al doilea utilizator poate apela codul de reintrare înainte ca primul utilizator să termine de lucrat cu acesta, iar acest lucru nu ar trebui să conducă la o eroare, iar dacă este implementat corect, nu ar trebui să provoace pierderi de calcule (adică, există nu ar trebui să fie nevoie să executați fragmente de cod deja executate).  

Reintrarea este strâns legată de siguranța unei funcții într-un mediu cu mai multe fire ( thread-safety ), cu toate acestea, acestea sunt concepte diferite. Asigurarea reintrării este esențială atunci când programați sisteme multitasking, în special sisteme de operare .

Pentru a asigura reintrarea, trebuie îndeplinite mai multe condiții:

În general, reintrarea necesită ca procesul de apelare sau funcția să transmită toate datele necesare procesului apelat de fiecare dată. Astfel, o funcție care depinde doar de parametrii săi, nu folosește variabile globale sau statice și doar apelează funcții reintrante va fi reintrată. Dacă funcția folosește variabile globale sau statice, trebuie să vă asigurați că fiecare utilizator își păstrează propria copie locală a acestor variabile.

Exemplu

În următorul fragment de cod, funcțiile f() și g() nu sunt reintrante.

int g_var = 1; int f() { g_var = g_var + 2; returnează g_var; } int g() { returnează f() + 2; }

Aici, f() depinde de variabila globală g_var , deci dacă două procese apelează f() în același timp, rezultatul este imprevizibil. Prin urmare, f() nu este reintrant. Dar nici g() nu este reintrant, deoarece folosește funcția nereintrată f() .

În următorul fragment de cod, funcția accum() nu este, de asemenea, reintratoare.

int acum(int b) { static int a = 0; ++a; return(a+b); }

Aici accum  este o funcție care acumulează valoarea a , pentru care variabila statică este responsabilă. Dacă accum este apelat prin procese diferite, rezultatul va fi, de asemenea, imprevizibil. Ca și în exemplul anterior, a este partajat de toate procesele de apelare.

De asemenea, pierderea reintrării poate apărea atunci când aceeași variabilă este folosită de mai multe ori într-o expresie.

#define SQR(x) ((x)*(x)) void func(void) { int x, y; x = SQR(y); }

În acest caz, macro SQR(x) nu va funcționa corect dacă se schimbă de fiecare dată când argumentul este accesat.

Link -uri