Multicore und Synchronisation

Der obige Code verdoppelt die gemeinsame Variable counter mit CAS(&p, erwarteter Wert, neuer Wert). Wann schlägt CAS fehl und die Schleife wird wiederholt?

int old, new;
do {
    old = counter;
    new = old * 2;
} while (!CAS(&counter, old, new));
  1. AWenn der Wert von counter 0 ist
  2. BWenn ein anderer Thread counter zwischen dem Lesen von old und der Ausführung von CAS verändert hat
  3. CWenn der Wert von new größer als old ist
Antwort und Erläuterung anzeigen

Antwort: B. Wenn ein anderer Thread counter zwischen dem Lesen von old und der Ausführung von CAS verändert hat

CAS schreibt den neuen Wert, wenn counter noch dem gelesenen Wert old entspricht. Hat ein anderer Thread den Wert in der Zwischenzeit geändert, wurde das lokale new aus einem veralteten Wert berechnet, es wird nicht geschrieben, und CAS meldet einen Fehlschlag. Die Schleife liest den aktuellen Wert neu und rechnet erneut. Für reine Additionen genügt Fetch-and-Add, doch auch beliebige Aktualisierungen wie das Verdoppeln lassen sich in dieser Form unteilbar durchführen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Wann schlägt bei einem Befehlspaar wie LR/SC (Load-Reserved/Store-Conditional) von RISC-V das SC (Store-Conditional) fehl?
  2. Welche Aussage zum ABA-Problem, das bei sperrfreien Datenstrukturen mit CAS auftritt, ist richtig?
  3. Wie arbeitet ein Fetch-and-Add-Befehl (fetch-and-add) wie der Befehl amoadd.w von RISC-V oder lock xadd von x86?
  4. Welche Aussage zu Spinlocks ist richtig?
  5. In welcher Situation eignet sich ein Spinlock am wenigsten?

Vergleiche zu diesem Thema