Kritieke sectie

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

Een kritieke sectie is een stuk broncode dat door hooguit één thread tegelijk uitgevoerd mag worden omdat er een gedeelde resource (variabelen, datastructuren, apparaten) in wordt gebruikt. Deze kritieke secties kunnen voorkomen in gedistribueerde computerprogramma's. Een synchronisatiemechanisme, zoals semaforen of monitors, moet voor en na de kritieke sectie worden geplaatst om er voor te zorgen dat niet meer dan één thread de code uitvoert.

Door kritieke secties te beschermen met synchronisatiemechanismen wordt voorkomen dat threads het werk van andere threads incorrect aanpassen of geheel ongedaan maken. De synchronisatie zorgt ervoor dat de toegang tot de gedeelde data na elkaar plaatsvindt. Als meerdere threads dezelfde kritieke sectie willen uitvoeren dan moeten deze op elkaar wachten totdat zij in de gelegenheid worden gesteld om de kritieke sectie uit te voeren.

Beschermen van kritieke secties[bewerken]

Het beschermen van kritieke secties is nodig om te voorkomen dat berekeningen van verschillende threads ongedaan gemaakt worden of ongewenste resultaten opleveren. Het volgende voorbeeld geeft een idee van de problemen die zich kunnen voordoen. Stel we hebben twee threads die de volgende code willen uitvoeren (in een gangbare programmeertaal zou dit er uit kunnen zien als c = c + 1;):

variabele c lezen
variabele c ophogen
variabele c wegschrijven

Deze threads worden door de scheduler van het besturingssysteem in staat gesteld om de code uit te voeren. De volgorde waarin de statements van beide threads worden uitgevoerd wordt bepaald door de scheduler. Het is mogelijk dat de threads afwisselend statements mogen uitvoeren of dat de statements op een andere manier achter elkaar worden geplaatst. Het gewenste resultaat is in dit geval dat beide threads de variabele c ophogen en dat c na afloop 2 hoger is dan voordat deze code werd uitgevoerd.

Stel dat de statements van beide threads in deze volgorde uitgevoerd:

variabele c lezen
                           variabele c lezen
variabele c ophogen
variabele c wegschrijven
                           variabele c ophogen
                           variabele c wegschrijven

Beide threads lezen dezelfde waarde die in de variabele c staat (stel dat dit 0 is). Vervolgens verhoogt de linkerthread de waarde en bewaart deze in c (c staat nu op 1). De rechterthread verhoogt nu de oorspronkelijke waarde van c (0) en schrijft die ook weg in c (c staat nu op 1). Het werk van de linkerthread is niet meer zichtbaar omdat de rechterthread nog de oude waarde verhoogde en niet de bijgewerkte waarde.