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++;
- AOmdat de CPU zich soms vergist bij de optelling
- BOmdat counter++ uit lezen, optellen en schrijven bestaat en bij overlap van twee threads een van de optellingen verloren gaat
- 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.