Tietokoneohjelmaa kokonaisuutena tai sen erillistä prosessia kutsutaan reentrantiksi , jos se on suunniteltu siten, että sama kopio muistissa olevista ohjelmakäskyistä voidaan jakaa useiden käyttäjien tai prosessien kesken. Samanaikaisesti toinen käyttäjä voi kutsua sisääntulevaa koodia ennen kuin ensimmäinen käyttäjä lopettaa työskentelyn sen kanssa, eikä tämän pitäisi ainakaan johtaa virheeseen, eikä oikein toteutettuina sen pitäisi aiheuttaa laskelmien menetystä (eli ei pitäisi olla tarvetta suorittaa jo suoritettuja koodinpätkiä).
Reentrancy liittyy läheisesti toiminnon turvallisuuteen monisäikeisessä ympäristössä ( thread-safety ), mutta nämä ovat kuitenkin eri käsitteitä. Uudelleen pääsyn varmistaminen on avainasemassa ohjelmoitaessa moniajojärjestelmiä, erityisesti käyttöjärjestelmiä .
Uudelleen pääsyn varmistamiseksi useiden ehtojen on täytyttävä:
Yleensä paluu vaatii, että kutsuva prosessi tai toiminto välittää kaikki tarvittavat tiedot kutsutulle prosessille joka kerta. Siten funktio, joka riippuu vain sen parametreista, ei käytä globaaleja tai staattisia muuttujia ja kutsuu vain reentrant-funktioita, on reentrant. Jos funktio käyttää globaaleja tai staattisia muuttujia, sinun on varmistettava, että jokainen käyttäjä säilyttää oman paikallisen kopion näistä muuttujista.
Seuraavassa koodinpätkässä funktiot f() ja g() eivät palaa.
int g_var = 1; int f() { g_var = g_muuttuja + 2; return g_var; } int g() { return f() + 2; }Tässä f() riippuu globaalista muuttujasta g_var , joten jos kaksi prosessia kutsuu f() :tä samanaikaisesti, tulos on arvaamaton. Siksi f() ei ole reentrant. Mutta g() ei myöskään ole reentrantti, koska se käyttää ei-reentrant-funktiota f() .
Seuraavassa koodinpätkässä accum()- funktio ei myöskään ole palaava.
int accum(int b) { staattinen int a = 0; ++a; paluu(a+b); }Tässä accum on funktio, joka kerää a : n arvon , josta staattinen muuttuja on vastuussa. Jos eri prosessit kutsuvat akkua , tulos on myös arvaamaton. Kuten edellisessä esimerkissä, kaikki kutsuprosessit jakavat a .
Myös palautumisen menetys voi tapahtua, kun samaa muuttujaa käytetään useammin kuin kerran lausekkeessa.
#define SQR(x) ((x)*(x)) void func(void) { int x, y; x = SQR(y); }Tässä tapauksessa makro SQR(x) ei toimi oikein, jos se muuttuu joka kerta, kun argumenttia käytetään.