Multicore en synchronisatie
De bovenstaande code verdubbelt de gedeelde variabele counter met CAS(&p, verwachte waarde, nieuwe waarde). Wanneer mislukt CAS en wordt de lus opnieuw doorlopen?
int old, new;
do {
old = counter;
new = old * 2;
} while (!CAS(&counter, old, new));
- AWanneer de waarde van counter 0 is
- BWanneer een andere thread counter heeft gewijzigd tussen het lezen van old en het uitvoeren van CAS
- CWanneer de waarde van new groter is dan old
Antwoord en toelichting tonen
Antwoord: B. Wanneer een andere thread counter heeft gewijzigd tussen het lezen van old en het uitvoeren van CAS
CAS schrijft de nieuwe waarde als counter nog de bij het lezen verkregen old is. Als een andere thread de waarde ondertussen heeft gewijzigd, is de lokale new op een verouderde waarde gebaseerd, dus wordt niet geschreven en wordt een mislukking gemeld. De lus leest de nieuwste waarde opnieuw en rekent opnieuw. Voor alleen optellen volstaat fetch-and-add, maar ook willekeurige bijwerkingen zoals verdubbelen kunnen op deze manier ondeelbaar worden uitgevoerd.