Återinträde

Ett datorprogram som helhet eller dess separata procedur kallas reentrant om det är  utformat på ett sådant sätt att samma kopia av programinstruktionerna i minnet kan delas av flera användare eller processer. Samtidigt kan den andra användaren anropa reentrant-koden innan den första användaren slutar arbeta med den, och detta bör åtminstone inte leda till ett fel, och om det implementeras korrekt ska det inte orsaka förlust av beräkningar (det vill säga där borde inte vara nödvändigt att köra redan körda kodfragment).  

Återinträde är nära besläktat med säkerheten för en funktion i en flertrådad miljö ( trådsäkerhet ), dock är detta olika koncept. Att säkerställa återinträde är nyckeln vid programmering av multitasking-system, särskilt operativsystem .

För att säkerställa återinträde måste flera villkor vara uppfyllda:

I allmänhet kräver återinträde att anropsprocessen eller funktionen skickar all nödvändig data till den anropade processen varje gång. En funktion som endast beror på dess parametrar, använder inte globala eller statiska variabler och endast anropar återinträdande funktioner kommer att vara återinträdande. Om funktionen använder globala eller statiska variabler måste du se till att varje användare behåller sin egen lokala kopia av dessa variabler.

Exempel

I följande kodavsnitt är funktionerna f() och g() inte återkommande.

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

Här beror f() på den globala variabeln g_var , så om två processer anropar f() samtidigt är resultatet oförutsägbart. Därför är f() inte återinträdande. Men g() är inte reentrant heller, eftersom den använder icke-reentrant-funktionen f() .

I följande kodavsnitt är funktionen accum() inte heller återkommande.

int accum(int b) { statisk int a = 0; ++a; return(a+b); }

Här är accum  en funktion som ackumulerar värdet av a , för vilken den statiska variabeln är ansvarig. Om accum anropas av olika processer blir resultatet också oförutsägbart. Som i föregående exempel delas a av alla anropsprocesser.

Dessutom kan förlust av återinträde inträffa när samma variabel används mer än en gång i ett uttryck.

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

I det här fallet kommer makrot SQR(x) inte att fungera korrekt om det ändras varje gång argumentet öppnas.

Länkar