Gegenfrage: Wissen Sie, warum std::atomic::fetch_add
den Vortransaktionswert zurückgibt? (Tue ich nicht.)
Aufruf swap!
führt eine Transaktion durch und gibt ihr Ergebnis zurück. Wenn in einem gleichzeitigen Szenario der Vortransaktionswert zurückgegeben wird, besteht die einzige deterministische Möglichkeit zum Abrufen des Transaktionsergebnisses darin, die in Transaktion befindliche Anwendung zu wiederholen, z. G.
(def pre-tx (std-swap! global-counter inc))
(def tx-result (inc pre-tx))
Sicherlich könnte ein umgekehrtes Beispiel für den Wert vor der Transaktion nachgeholt werden. In den meisten Fällen (und auch in Ihrem Beispielfall - siehe unten) ist das tx-Ergebnis der Wert, der für die weitere Referenz relevant ist. Deshalb wurde swap!
entworfen, um es direkt zurückzugeben. Für unterschiedliche Anforderungen ist eine ref
geeignet (Sofern nicht eine atom
Voraussetzung ist, müssen Sie in diesem Fall eine eigene Spin-Schleife mit compare-and-set!
erstellen).
In Ihrem Beispiel sollten next!
1
beim ersten Anruf zurückzukehren, und es gibt keinen Grund zu dec
es solange Zählen der gegebenen Beispiel ist. Das Zählen beginnt immer mit einem: Wenn Sie eins zählen, ist Ihre Gesamtzahl 1
. Wenn next!
jemals zurückgegeben wird 0
(imaginär) last!
würde -1
, eine ungültige Gesamtzahl zurückgeben.
'(def global-counter (Atom -1))' und loswerden 'dec' Aufruf? – hsestupin
@hsestupin es funktioniert nicht für unsigned Int, die sowieso nicht in Java existiert :) – woodings
ok, schau dir meine Antwort unten an. AtomicInteger ist schneller als Clojure-Atome und sieht mehr idiomatisch und passender für Ihren Fall aus. – hsestupin