Übersicht
Verwenden Sie die folgenden Funktionen, um Werte zu aktualisieren, die von mehreren Threads gemeinsam genutzt werden.
Sie sorgen dafür, dass die Werte atomar aktualisiert werden, d.h., dass die Arbeitsspeicherlesevorgänge, die Aktualisierungen und die Schreibvorgänge im Arbeitsspeicher in der richtigen Reihenfolge ausgeführt werden.
Diese Funktionen sind langsamer als ihre nicht atomaren Äquivalente und sollten daher nur verwendet werden, wenn eine Synchronisierung erforderlich ist.
In RenderScript wird Ihr Code wahrscheinlich in separaten Threads ausgeführt, auch wenn Sie sie nicht explizit erstellt haben. In der RenderScript-Laufzeit wird die Ausführung eines Kernels sehr oft auf mehrere Threads aufgeteilt. Das Aktualisieren globaler Elemente sollte mit atomaren Funktionen erfolgen. Ändern Sie nach Möglichkeit den Algorithmus, um sie ganz zu vermeiden.
Zusammenfassung
Funktionen
rsAtomicAdd
: Thread-sicheres Hinzufügen
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Aufzuzahlender Betrag. |
Returns
Wert von *addr vor dem Vorgang. |
Fügt dem Wert bei Adr atomar einen Wert hinzu, z.B. *addr += value
.
rsAtomicAnd
: Bitweiser Thread-sicher und
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Wert für und mit. |
Returns
Wert von *addr vor dem Vorgang. |
Führt atomar eine Bitweise mit zwei Werten aus und speichert das Ergebnis wieder beim Addr, z.B. *addr &= value
.
rsAtomicCas
: Thread-sicheres Vergleichen und Festlegen
Parameter
Adr | Adresse des Werts, der verglichen und ersetzt werden soll, wenn der Test bestanden wird. |
compareValue (Vergleichswert) | Testwert *addr. |
newValue | Wert, der geschrieben werden soll, wenn der Test bestanden wird. |
Returns
Wert von *addr vor dem Vorgang. |
Wenn der Wert unter „addr“ mit „compareValue“ übereinstimmt, wird der Wert für „newValue“ bei „addr“ geschrieben, also if (*addr == compareValue) { *addr = newValue; }
.
Sie können prüfen, ob der Wert geschrieben wurde, indem Sie prüfen, ob der von rsAtomicCas() zurückgegebene Wert CompareValue ist.
rsAtomicDec
: Thread-sichere Dekrementierung
Parameter
Adr | Adresse des zu reduzierenden Werts. |
Returns
Wert von *addr vor dem Vorgang. |
Subtrahiert atomisch eins vom Wert bei der Addition. Dies entspricht rsAtomicSub(addr, 1)
.
rsAtomicInc
: Thread-sicheres Inkrement
Parameter
Adr | Adresse des zu erhöhenden Werts. |
Returns
Wert von *addr vor dem Vorgang. |
Fügt dem Wert bei adr atomar eine 1 hinzu. Dies entspricht rsAtomicAdd(addr, 1)
.
rsAtomicMax
: Thread-sicheres Maximum
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Vergleichswert. |
Returns
Wert von *addr vor dem Vorgang. |
Setzt den Wert für „addr“ untrennbar auf den Maximalwert von *addr und value, also *addr = max(*addr, value)
.
rsAtomicMin
: Thread-sicheres Minimum
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Vergleichswert. |
Returns
Wert von *addr vor dem Vorgang. |
Setzt den Wert für "addr" untrennbar auf das Minimum von *addr und value, also *addr = min(*addr, value)
.
rsAtomicOr
: Thread-sicher – bitweise oder
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Wert für oder mit. |
Returns
Wert von *addr vor dem Vorgang. |
Führen Sie einen bitweisen oder zwei Werte atomar aus und speichern Sie das Ergebnis bei addr, z.B. *addr |= value
.
rsAtomicSub
: Thread-sichere Subtraktion
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Subtrahierer Betrag. |
Returns
Wert von *addr vor dem Vorgang. |
Subtrahiert einen Wert atomar vom Wert an der Adresse, z.B. *addr -= value
.
rsAtomicXor
: Thread-sicheres bitweises Exklusiv- oder
Parameter
Adr | Adresse des zu ändernden Werts. |
value | Wert für XOR. |
Returns
Wert von *addr vor dem Vorgang. |
Führt ein bitweises Xor von zwei Werten atomar aus und speichert das Ergebnis bei addr, z.B. *addr ^= value
.