Multicore und Synchronisation

Wie arbeitet der atomare Befehl CAS (Compare-and-Swap)?

  1. AEr schreibt nur dann einen neuen Wert in den Speicher, wenn der Speicherwert dem erwarteten Wert entspricht, und zeigt an, ob dies gelungen ist
  2. BEr vergleicht die Werte zweier Speicherstellen und schreibt den größeren in beide
  3. CEr tauscht den Speicherwert und den Registerwert ohne Bedingung aus
Antwort und Erläuterung anzeigen

Antwort: A. Er schreibt nur dann einen neuen Wert in den Speicher, wenn der Speicherwert dem erwarteten Wert entspricht, und zeigt an, ob dies gelungen ist

CAS führt unteilbar aus: „Wenn der Wert an dieser Adresse noch dem erwarteten Wert entspricht, wird er durch den neuen ersetzt.“ Hat ein anderer Thread den Wert zwischen Lesen und Schreiben geändert, schlägt CAS fehl, sodass sich prüfen lässt, dass nicht dazwischen verändert wurde. Bei einem Fehlschlag wird neu gelesen, gerechnet und CAS in einer Schleife wiederholt, wodurch sich gemeinsame Werte ohne Sperre sicher aktualisieren lassen. Entsprechend ist z. B. der Befehl cmpxchg bei x86.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

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

Vergleiche zu diesem Thema