Egy számítógépi program egészét vagy annak különálló eljárását reentrantnak nevezzük, ha úgy van megtervezve, hogy a memóriában lévő programutasítások ugyanazt a példányát több felhasználó vagy folyamat meg tudja osztani. Ugyanakkor a második felhasználó meghívhatja az újra belépő kódot, mielőtt az első felhasználó befejezné a vele való munkát, és ez legalább nem vezethet hibához, és helyesen végrehajtva nem okozhat számítási veszteséget (vagyis nem kell végrehajtani a már végrehajtott kódrészleteket).
A reentrancy szorosan összefügg egy funkció biztonságával többszálú környezetben ( szál-biztonság ), azonban ezek különböző fogalmak. Az újrabelépés biztosítása kulcsfontosságú a többfeladatos rendszerek, különösen az operációs rendszerek programozásakor .
Az újbóli belépéshez több feltételnek kell teljesülnie:
Általában az újrabelépés megköveteli, hogy a hívó folyamat vagy függvény minden szükséges adatot átadjon a hívott folyamatnak. Így az a függvény, amely csak a paramétereitől függ, nem használ globális vagy statikus változókat, és csak újra belépő függvényeket hív meg, újra belépő lesz. Ha a függvény globális vagy statikus változókat használ, gondoskodnia kell arról, hogy minden felhasználó megőrizze a saját helyi másolatát ezekről a változókról.
A következő kódrészletben az f() és g() függvények nem lépnek be újra.
int g_var = 1; int f() { g_var = g_var + 2; return g_var; } int g() { return f() + 2; }Itt f() függ a g_var globális változótól , tehát ha két folyamat egyszerre hívja az f() -t, akkor az eredmény megjósolhatatlan. Ezért az f() nem visszatérő. De a g() sem reentrant, mert az f() nem visszatérő függvényt használja .
A következő kódrészletben az accum() függvény szintén nem lép be újra.
int accum(int b) { statikus int a = 0; ++a; return(a+b); }Itt az accum egy olyan függvény, amely felhalmozza a értékét , amelyért a statikus változó felelős. Ha az accumot különböző folyamatok hívják, akkor az eredmény is kiszámíthatatlan lesz. Az előző példához hasonlóan az a - t az összes hívó folyamat megosztja.
A visszatérés elvesztése akkor is előfordulhat, ha ugyanazt a változót többször használják egy kifejezésben.
#define SQR(x) ((x)*(x)) void func(void) { int x, y; x = SQR(y); }Ebben az esetben az SQR(x) makró nem fog megfelelően működni, ha az argumentum minden elérésekor változik.