A kritikus szakasz a program végrehajtható kódjának egy része, amely egy megosztott erőforráshoz (adatokhoz vagy eszközhöz) fér hozzá, amelyet nem használhat egyszerre több végrehajtási szál . Ha két (vagy több) szál van a kritikus szakaszban, akkor "verseny" ("verseny") állapot lép fel. Ennek elkerülése érdekében négy feltételnek kell teljesülnie:
A kritikus szakasz egy szál-szinkronizálási objektum, amely lehetővé teszi egy bizonyos műveletcsoport (általában adathozzáféréssel kapcsolatos) egyidejű végrehajtásának megakadályozását több szálon keresztül. A kritikus szakasz ugyanazokat a feladatokat látja el, mint a mutex .
Terminológiai különbségek vannak a mutex és a kritikus szakasz között: így a mutex „elfogásához” hasonló eljárást a kritikus szakaszba való belépésnek ( eng. enter ), a mutex feloldásához pedig a kritikus szakaszból való kilépésnek ( eng. elhagyás ) nevezzük. .
A kritikus szakaszokba való be- és kilépési eljárás általában kevesebb időt vesz igénybe, mint a hasonló mutex műveletek, ami az operációs rendszer kerneléhez való hozzáférés hiányából adódik.
A Microsoft Windows család operációs rendszereiben az a különbség a mutex és a kritikus szakasz között, hogy a mutex egy kernel objektum, és egyszerre több folyamat is használhatja, míg a kritikus rész a folyamathoz tartozik és a szinkronizálást szolgálja. csak a szálai.
A Windows kritikus szakaszai optimalizálva vannak egy atomosan változtatható változó használatára a kernel "sync event" objektumával együtt. Egy kritikus szakasz rögzítése a változó 1-gyel való atomi növekedését jelenti. A kerneleseményre való várakozásra váltás csak akkor történik meg, ha a változó értéke a rögzítés előtt már nagyobb volt 0-nál, vagyis valódi "verseny" van két vagy több szál egy erőforráshoz.
Így vita hiányában egy kritikus szakasz rögzítése/kiosztása megkerülhető a kernel hívása nélkül.
Ezenkívül a már foglalt kritikus szakasz rögzítése a kernel elérése előtt rövid ideig várakozik a ciklusban (a ciklus iterációinak számát (az angol spin count ) az InitializeCriticalSectionAndSpinCount () vagy a SetCriticalSectionSpinCount () függvények állítják be), lekérdezve a ciklust. változó számú aktuális felhasználókat, és ha ez a változó 0 lesz, akkor a rögzítés a kernel hívása nélkül történik.
A Windows kernelben található hasonló objektum neve FAST_MUTEX ( ExAcquire/ReleaseFastMutex ). Abban különbözik a kritikus szakasztól, hogy nem támogatja a rekurzív újragyűjtést ugyanazon szálon keresztül.
A Linuxban egy hasonló objektumot futexnek hívnak .