Multicore und Synchronisation

Wie arbeitet ein Fetch-and-Add-Befehl (fetch-and-add) wie der Befehl amoadd.w von RISC-V oder lock xadd von x86?

  1. AEr liest nur den Speicherwert, die Addition erfolgt im Register
  2. BEr addiert die Werte zweier Speicheradressen und schreibt das Ergebnis an eine dritte
  3. CEr addiert unteilbar eine vorgegebene Zahl zum Speicherwert und liefert den Wert vor der Addition zurück
Antwort und Erläuterung anzeigen

Antwort: C. Er addiert unteilbar eine vorgegebene Zahl zum Speicherwert und liefert den Wert vor der Addition zurück

Fetch-and-Add führt Lesen, Addieren und Schreiben als eine unteilbare Operation aus und löst damit das Data Race von counter++ mit einem einzigen Befehl. Da der Wert vor der Addition zurückgegeben wird, eignet er sich auch für Verfahren wie die Ausgabe von Nummernkarten in Reihenfolge (z. B. um jedem Thread eine nicht überlappende Nummer zuzuteilen). Da es anders als bei CAS-Schleifen keinen Fehlschlag und keine Wiederholung gibt, ist er vorteilhaft, wenn viele Threads gleichzeitig aktualisieren.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Welche Aussage zu Spinlocks ist richtig?
  2. In welcher Situation eignet sich ein Spinlock am wenigsten?
  3. Warum wartet man bei Spinlocks (Test-and-Test-and-Set) normalerweise mit gewöhnlichem Lesen auf die Freigabe, statt die Sperrvariable sofort mit einem atomaren Befehl zu ändern, und verwendet den atomaren Befehl nur, wenn die Sperre frei erscheint?
  4. Welche Aussage im Vergleich von Mutex (schlafend wartende Sperre) und Spinlock ist richtig?
  5. Welches Beispiel für einen Deadlock ist richtig?

Vergleiche zu diesem Thema