Multicore en synchronisatie
Waarom wordt bij een conditievariabele, wanneer wordt gewacht tot de wachtrij niet meer leeg is, na het ontwaken de voorwaarde opnieuw gecontroleerd met een while-lus in plaats van een if-opdracht?
- AOmdat een while-lus sneller wordt uitgevoerd dan een if-opdracht
- BOmdat een conditievariabele volgens de regels niet met een if-opdracht kan worden gebruikt
- COmdat de thread ook na het wekken kan merken dat de voorwaarde niet vervuld is, doordat een andere thread eerder iets heeft weggehaald of de thread zonder reden is ontwaakt
Antwoord en toelichting tonen
Antwoord: C. Omdat de thread ook na het wekken kan merken dat de voorwaarde niet vervuld is, doordat een andere thread eerder iets heeft weggehaald of de thread zonder reden is ontwaakt
Wachten op een conditievariabele laat de lock los, slaapt en neemt na wakker worden door een melding de lock opnieuw voordat hij terugkeert. In de tussentijd kan een andere thread eerder de lock nemen en het element uit de wachtrij halen. Bovendien is toegestaan dat vanwege de implementatie zonder melding wordt ontwaakt (spurious wakeup). Daarom wordt na het ontwaken de voorwaarde gecontroleerd en wordt met een while-lus opnieuw gewacht als die niet is vervuld.