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));
  1. AWanneer de waarde van counter 0 is
  2. BWanneer een andere thread counter heeft gewijzigd tussen het lezen van old en het uitvoeren van CAS
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Multicore en synchronisatie

  1. Wanneer mislukt bij een instructiepaar zoals LR/SC (load-reserved/store-conditional) van RISC-V de SC (store-conditional)?
  2. Welke uitleg over het ABA-probleem, dat bij lock-free datastructuren met CAS aandacht vraagt, is juist?
  3. Welke beschrijving van de werking van een fetch-and-add-instructie, zoals amoadd.w van RISC-V of lock xadd van x86, is juist?
  4. Welke uitleg over een spinlock is juist?
  5. In welke situatie is een spinlock het minst geschikt?

Vergelijkingen bij dit onderwerp