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?

  1. AOmdat een while-lus sneller wordt uitgevoerd dan een if-opdracht
  2. BOmdat een conditievariabele volgens de regels niet met een if-opdracht kan worden gebruikt
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Multicore en synchronisatie

  1. Twee cores hebben elk in hun eigen cache een kopie van variabele x. Welk probleem kan optreden wanneer core 1 x leest nadat core 0 naar x heeft geschreven, als er geen cachecoherentiemechanisme is?
  2. Welke combinatie van de vier toestanden van het cachecoherentieprotocol MESI is juist?
  3. Wat betekent het wanneer een cacheregel in het MESI-protocol in de toestand Modified (M) staat?
  4. Wat gebeurt er in het MESI-protocol wanneer die core naar een regel in de toestand Exclusive (E) schrijft?
  5. Wat gebeurt er in een ongeldigverklarend (invalidate) coherentieprotocol wanneer een core naar een regel in de toestand Shared (S) schrijft?

Vergelijkingen bij dit onderwerp