Funktionen für atomare RenderScript-Updates

Ü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 Threadsicheres Hinzufügen
rsAtomicAnd Thread-sicher – bitweise und
rsAtomicCas Threadsicheres Vergleichen und Festlegen
rsAtomicDe Threadsicheres Dekrementieren
rsAtomic Inc. Threadsicheres Inkrement
rsAtomicMax Thread-sicheres Maximum
rsAtomicMin Thread-sicheres Minimum
rsAtomicOr Thread-sicher – bitweises oder
rsAtomicSub Threadsichere Subtraktion
rsAtomicXor Threadsicheres bitweises Exklusiv- oder

Funktionen

rsAtomicAdd : Thread-sicheres Hinzufügen

int32_t rsAtomicAdd(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); In API-Level 20 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueAufzuzahlender 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

int32_t rsAtomicAnd(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); In API-Level 20 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueWert 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

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); In API-Level 14 hinzugefügt
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); In API-Level 14 hinzugefügt
Parameter
AdrAdresse des Werts, der verglichen und ersetzt werden soll, wenn der Test bestanden wird.
compareValue (Vergleichswert)Testwert *addr.
newValueWert, 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

int32_t rsAtomicDec(volatile int32_t* addr); In API-Level 14 hinzugefügt
int32_t rsAtomicDec(volatile uint32_t* addr); In API-Level 20 hinzugefügt
Parameter
AdrAdresse 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

int32_t rsAtomicInc(volatile int32_t* addr); In API-Level 14 hinzugefügt
int32_t rsAtomicInc(volatile uint32_t* addr); In API-Level 20 hinzugefügt
Parameter
AdrAdresse 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

int32_t rsAtomicMax(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
uint32_t rsAtomicMax(volatile uint32_t* addr, uint32_t value); In API-Level 14 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueVergleichswert.
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

int32_t rsAtomicMin(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t value); In API-Level 14 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueVergleichswert.
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

int32_t rsAtomicOr(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); In API-Level 20 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueWert 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

int32_t rsAtomicSub(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
int32_t rsAtomicSub(volatile uint32_t* addr, uint32_t value); In API-Level 20 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueSubtrahierer 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

int32_t rsAtomicXor(volatile int32_t* addr, int32_t value); In API-Level 14 hinzugefügt
int32_t rsAtomicXor(volatile uint32_t* addr, uint32_t value); In API-Level 20 hinzugefügt
Parameter
AdrAdresse des zu ändernden Werts.
valueWert 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.