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?
- AEr liest nur den Speicherwert, die Addition erfolgt im Register
- BEr addiert die Werte zweier Speicheradressen und schreibt das Ergebnis an eine dritte
- 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.