Multicore en synchronisatie

Wanneer bovenstaande code door twee threads tegelijk wordt uitgevoerd, kan de uiteindelijke waarde van counter kleiner zijn dan 200000. Wat is de juiste reden?

int counter = 0;
// 2つのスレッドが同時に、それぞれ
for (int i = 0; i < 100000; i++)
    counter++;
  1. AOmdat de CPU zich soms vergist bij de optelling
  2. BOmdat counter++ uit lezen, optellen en schrijven bestaat en bij overlap van twee threads een van de optellingen verloren gaat
  3. COmdat het aantal lusiteraties per thread automatisch wordt gehalveerd
Antwoord en toelichting tonen

Antwoord: B. Omdat counter++ uit lezen, optellen en schrijven bestaat en bij overlap van twee threads een van de optellingen verloren gaat

counter++ bestaat uit drie bewerkingen: een waarde uit het geheugen lezen, 1 optellen en terugschrijven. Als thread A 100 leest en thread B ook 100 leest voordat A terugschrijft, schrijven beide 101 en worden twee optellingen er één. Dit is een typisch voorbeeld van een data race. Met een atomaire optelinstructie of een lock waarmee slechts één thread tegelijk bijwerkt, wordt het resultaat juist 200000.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Multicore en synchronisatie

  1. Welke uitleg over atomaire instructies (ondeelbare instructies) is juist?
  2. Welke beschrijving van de werking van de atomaire instructie CAS (compare-and-swap) is juist?
  3. De bovenstaande code verdubbelt de gedeelde variabele counter met CAS(&p, verwachte waarde, nieuwe waarde). Wanneer mislukt CAS en wordt de lus opnieuw doorlopen?
  4. Wanneer mislukt bij een instructiepaar zoals LR/SC (load-reserved/store-conditional) van RISC-V de SC (store-conditional)?
  5. Welke uitleg over het ABA-probleem, dat bij lock-free datastructuren met CAS aandacht vraagt, is juist?

Vergelijkingen bij dit onderwerp