Funzioni di aggiornamento atomico RenderScript

Panoramica

Per aggiornare i valori condivisi tra più thread, utilizza le funzioni riportate di seguito. Garantiscono che i valori vengano aggiornati a livello atomico, ovvero che la memoria viene lettura, gli aggiornamenti e le scritture della memoria vengono eseguite nell'ordine corretto.

Queste funzioni sono più lente rispetto agli equivalenti non atomici, quindi utilizzale solo quando è necessaria la sincronizzazione.

Tieni presente che in RenderScript è probabile che il codice venga eseguito in thread separati anche se non li hai creati esplicitamente. Molto spesso il runtime RenderScript suddivide l'esecuzione di un kernel in più thread. L'aggiornamento dei globali dovrebbe essere eseguito con le funzioni atomiche. Se possibile, modifica l'algoritmo per evitarli del tutto.

Riepilogo

Funzioni
rsAtomicAdd Aggiunta sicura per thread
rsAtomicAnd Thread-safe a bit e
rsAtomicCas Confronto e impostazione sicura dei thread
rsAtomicDec Decremento sicuro per thread
rsAtomicInc Incremento Threadsafe
rsAtomicMax Massima sicurezza per thread
rsAtomicMin Minimo per thread sicuro
rsAtomicOr Thread-safe a bit o
rsAtomicSub Sottrazione per thread sicuro
rsAtomicXor Esclusiva a bit a livello di thread o

Funzioni

rsAtomicAdd : aggiunta sicura per i thread

int32_t rsAtomicAdd(volatile int32_t* addr, valore int32_t); Aggiunto al livello API 14
int32_t rsAtomicAdd(volatile uint32_t* addr, valore uint32_t); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da modificare.
valueImporto da aggiungere.
Ritorni
Valore di *addr prima dell'operazione.

Aggiunge atomicamente un valore al valore nell'indirizzo, ad esempio *addr += value.

rsAtomicAnd : sicurezza per Thread a livello di bit e

int32_t rsAtomicAnd(volatile int32_t* addr, valore int32_t); Aggiunto al livello API 14
int32_t rsAtomicAnd(volatile uint32_t* addr, valore uint32_t); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da modificare.
valueValore da e con.
Ritorni
Valore di *addr prima dell'operazione.

Atomicly esegue un bit a bit e presenta due valori, memorizzando il risultato in addr, ovvero *addr &= value.

rsAtomicCas : confronto e impostazione sicura di Thread

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); Aggiunto al livello API 14
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); Aggiunto al livello API 14
Parametri
indirizzoIndirizzo del valore da confrontare e sostituire se il test ha esito positivo.
ConfrontaValoreValore di cui verificare *addr.
nuovoValoreValore da scrivere se il test ha esito positivo.
Ritorni
Valore di *addr prima dell'operazione.

Se il valore all'indirizzo addr corrisponde a compareValue, il nuovo valore viene scritto in addr, ovvero if (*addr == compareValue) { *addr = newValue; }.

Puoi verificare che il valore sia stato scritto controllando che il valore restituito da rsAtomicCas() sia compareValue.

rsAtomicDec : decremento compatibile con Thread

int32_t rsAtomicDec(volatile int32_t* addr); Aggiunto al livello API 14
int32_t rsAtomicDec(volatile uint32_t* addr); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da diminuire.
Ritorni
Valore di *addr prima dell'operazione.

Sottrae atomicamente uno dal valore nel sommatore. Equivale a rsAtomicSub(addr, 1).

rsAtomicInc : incremento Threadsafe

int32_t rsAtomicInc(volatile int32_t* indirizzo); Aggiunto al livello API 14
int32_t rsAtomicInc(volatile uint32_t* indirizzo); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da incrementare.
Ritorni
Valore di *addr prima dell'operazione.

Aggiunge atomicamente uno al valore in addr. Equivale a rsAtomicAdd(addr, 1).

rsAtomicMax : valore massimo per la sicurezza Thread

int32_t rsAtomicMax(volatile int32_t* addr, valore int32_t); Aggiunto al livello API 14
uint32_t rsAtomicMax(indirizzo email uint32_t* volatile, valore uint32_t); Aggiunto al livello API 14
Parametri
indirizzoIndirizzo del valore da modificare.
valueValore di confronto.
Ritorni
Valore di *addr prima dell'operazione.

Imposta in modo atomico il valore in addr al massimo di *addr e value, ovvero *addr = max(*addr, value).

rsAtomicMin : livello minimo di sicurezza per thread

int32_t rsAtomicMin(volatile int32_t* addr, valore int32_t); Aggiunto al livello API 14
uint32_t rsAtomicMin(indirizzo email uint32_t* volatile, valore uint32_t); Aggiunto al livello API 14
Parametri
indirizzoIndirizzo del valore da modificare.
valueValore di confronto.
Ritorni
Valore di *addr prima dell'operazione.

Imposta in modo atomico il valore in addr sul minimo di *addr e value, ovvero *addr = min(*addr, value).

rsAtomicOr : sicurezza per thread a livello di bit o

int32_t rsAtomicOr(volatile int32_t* addr, valore int32_t); Aggiunto al livello API 14
int32_t rsAtomicOr(volatile uint32_t* addr, valore uint32_t); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da modificare.
valueValore da o con.
Ritorni
Valore di *addr prima dell'operazione.

Esegui atomicamente uno o due valori a bit, memorizzando il risultato in addr, ovvero *addr |= value.

rsAtomicSub : sottrazione sicura per thread

int32_t rsAtomicSub(indirizzo volatile int32_t*, valore int32_t); Aggiunto al livello API 14
int32_t rsAtomicSub(indirizzo email uint32_t* volatile, valore uint32_t); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da modificare.
valueImporto da sottrarre.
Ritorni
Valore di *addr prima dell'operazione.

Sottrae atomicamente un valore dal valore nel sommatore, ad esempio *addr -= value.

rsAtomicXor : esclusiva per bit a livello di Thread o

int32_t rsAtomicXor(volatile int32_t* addr, valore int32_t); Aggiunto al livello API 14
int32_t rsAtomicXor(indirizzo email uint32_t* volatile, valore uint32_t); Aggiunto al livello API 20
Parametri
indirizzoIndirizzo del valore da modificare.
valueValore con cui Xor.
Ritorni
Valore di *addr prima dell'operazione.

Atomicly esegue uno xor a livello di bit di due valori, memorizzando il risultato in addr, ovvero *addr ^= value.