title: Kritieke sectie
text: Een kritieke sectie is een stuk broncode dat door hooguit één thread tegelijk mag worden uitgevoerd omdat er gedeelde resourcen (bijvoorbeeld variabelen, datastructuren of apparaten) in worden 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 gegevens na elkaar plaatsvindt. Als verschillende 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 
  
  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 worden 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, waardoor c op 1 komt. De rechterthread verhoogt nu de oorspronkelijke waarde van c, die was 0, en schrijft die ook weg in c, dus blijft c 1. Het werk van de linkerthread is niet meer zichtbaar omdat de rechterthread nog de oude waarde verhoogde en niet de bijgewerkte waarde.
  
  Programmeren