Genindtræden

Et computerprogram som helhed eller dets separate procedure kaldes reentrant , hvis det er  designet på en sådan måde, at den samme kopi af programinstruktionerne i hukommelsen kan deles af flere brugere eller processer. Samtidig kan den anden bruger ringe til reentrant-koden, før den første bruger er færdig med at arbejde med den, og det bør i det mindste ikke føre til en fejl, og hvis det implementeres korrekt, bør det ikke forårsage tab af beregninger (dvs. burde ikke være nødvendigt at udføre allerede udførte kodefragmenter).  

Reentrancy er tæt forbundet med sikkerheden ved en funktion i et flertrådsmiljø ( tråd-sikkerhed ), men det er forskellige begreber. At sikre genindtræden er nøglen ved programmering af multitasking-systemer, især operativsystemer .

For at sikre genindtræden skal flere betingelser være opfyldt:

Generelt kræver genindtræden, at den kaldende proces eller funktion sender alle nødvendige data til den kaldte proces hver gang. En funktion, der kun afhænger af dens parametre, bruger således ikke globale eller statiske variabler, og kun kalder reentrant-funktioner vil være reentrant. Hvis funktionen bruger globale eller statiske variable, skal du sikre dig, at hver bruger beholder deres egen lokale kopi af disse variable.

Eksempel

I det følgende kodestykke er funktionerne f() og g() ikke genindtrædende.

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

Her afhænger f() af den globale variabel g_var , så hvis to processer kalder f() på samme tid, er resultatet uforudsigeligt. Derfor er f() ikke reentrant. Men g() er heller ikke reentrant, fordi den bruger ikke-reentrant-funktionen f() .

I det følgende kodestykke er funktionen accum() heller ikke reentrant.

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

Her er accum  en funktion, der akkumulerer værdien af ​​a , som den statiske variabel er ansvarlig for. Hvis accum kaldes af forskellige processer, vil resultatet også være uforudsigeligt. Som i det foregående eksempel er a delt af alle opkaldsprocesser.

Tab af genindtræden kan også forekomme, når den samme variabel bruges mere end én gang i et udtryk.

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

I dette tilfælde vil makroen SQR(x) ikke fungere korrekt, hvis den ændres, hver gang argumentet tilgås.

Links