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 i thread
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Importo 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
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Valore 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
Parametri
indirizzo | Indirizzo del valore da confrontare e sostituire se il test ha esito positivo. |
ConfrontaValore | Valore di cui verificare *addr. |
nuovoValore | Valore 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
Parametri
indirizzo | Indirizzo 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
Parametri
indirizzo | Indirizzo 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
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Valore 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
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Valore 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
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Valore 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
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Importo 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
Parametri
indirizzo | Indirizzo del valore da modificare. |
value | Valore 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
.