Fonctions de mise à jour atomique de RenderScript

Présentation

Pour mettre à jour les valeurs partagées entre plusieurs threads, utilisez les fonctions ci-dessous. Ils garantissent que les valeurs sont mises à jour de manière atomique, c'est-à-dire que les lectures, les mises à jour et les écritures de la mémoire sont effectuées dans le bon ordre.

Ces fonctions sont plus lentes que leurs équivalents non atomiques. Vous ne devez donc les utiliser que lorsqu'une synchronisation est nécessaire.

Notez que dans RenderScript, votre code est susceptible de s'exécuter dans des threads distincts, même si vous ne les avez pas créés explicitement. L'environnement d'exécution RenderScript divise très souvent l'exécution d'un noyau sur plusieurs threads. La mise à jour des éléments généraux doit être effectuée à l'aide de fonctions atomiques. Si possible, modifiez votre algorithme pour les éviter complètement.

Résumé

Fonctions
rsAtomicAdd Ajout sécurisé
rsAtomicAnd Thread sécurisé et au niveau du bit
rsAtomicCas Fonctionnalité de comparaison et de définition sécurisée
rsAtomicDec Décréement de type thread sécurisé
rsAtomicInc Incrément de sécurité thread
rsAtomicMax Sécurité maximale
rsAtomicMin Valeur minimale de sécurité du thread
rsAtomicOr Thread sécurisé au niveau du bit ou
rsAtomicSub Soustraction sécurisée
rsAtomicXor Thread sécurisé exclusif ou au niveau du bit

Fonctions

rsAtomicAdd : ajout sécurisé

int32_t rsAtomicAdd(volatile int32_t* addr, valeur int32_t); Ajouté au niveau d'API 14
int32_t rsAtomicAdd(volatile uint32_t* addr, valeur uint32_t); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à modifier.
valueMontant à ajouter.
Renvoie
Valeur de *addr avant l'opération.

Ajoute atomiquement une valeur à la valeur au niveau de l'addition, c'est-à-dire *addr += value.

rsAtomicAnd : thread sécurisé au niveau du bit et

int32_t rsAtomicAnd(volatile int32_t* addr, valeur int32_t); Ajouté au niveau d'API 14
int32_t rsAtomicAnd(volatile uint32_t* addr, valeur uint32_t); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à modifier.
valueValeur vers et avec.
Renvoie
Valeur de *addr avant l'opération.

Effectue atomiquement un bit à bit et deux valeurs, en stockant le résultat au niveau de l'addition, par exemple *addr &= value.

rsAtomicCas : comparaison et définition sécurisées

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); Ajouté au niveau d'API 14
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); Ajouté au niveau d'API 14
Paramètres
AddrAdresse de la valeur à comparer et à remplacer si le test réussit.
compareValueValeur à utiliser pour tester *addr.
nouvelleValeurValeur à écrire si le test réussit.
Renvoie
Valeur de *addr avant l'opération.

Si la valeur au niveau de "addr" correspond à compareValue, la nouvelle valeur est écrite au niveau de "addr", c'est-à-dire if (*addr == compareValue) { *addr = newValue; }.

Vous pouvez vérifier que la valeur a été écrite en vérifiant que la valeur renvoyée par rsAtomicCas() est compareValue.

rsAtomicDec : décrémentation thread-safe

int32_t rsAtomicDec(volatile int32_t* addr); Ajouté au niveau d'API 14
int32_t rsAtomicDec(volatile uint32_t* addr); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à décrémenter.
Renvoie
Valeur de *addr avant l'opération.

Soustrait atomiquement 1 de la valeur au point d'addition. Cela équivaut à rsAtomicSub(addr, 1).

rsAtomicInc : incrément sécurisé

int32_t rsAtomicInc(volatile int32_t* addr); Ajouté au niveau d'API 14
int32_t rsAtomicInc(volatile uint32_t* addr); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à incrémenter.
Renvoie
Valeur de *addr avant l'opération.

Ajoute atomiquement un à la valeur au niveau de l'addition. Cela équivaut à rsAtomicAdd(addr, 1).

rsAtomicMax : valeur maximale de thread sécurisé

int32_t rsAtomicMax(volatile int32_t* addr, valeur int32_t); Ajouté au niveau d'API 14
uint32_t rsAtomicMax(volatile uint32_t* addr, valeur uint32_t); Ajouté au niveau d'API 14
Paramètres
AddrAdresse de la valeur à modifier.
valueValeur de comparaison.
Renvoie
Valeur de *addr avant l'opération.

Définit de manière atomique la valeur "addr" sur le maximum "*addr" et "value", soit *addr = max(*addr, value).

rsAtomicMin : minimum sécurisé

int32_t rsAtomicMin(volatile int32_t* addr, valeur int32_t); Ajouté au niveau d'API 14
uint32_t rsAtomicMin(volatile uint32_t* addr, valeur uint32_t); Ajouté au niveau d'API 14
Paramètres
AddrAdresse de la valeur à modifier.
valueValeur de comparaison.
Renvoie
Valeur de *addr avant l'opération.

Définit atomiquement la valeur au point "addr" sur le minimum de *addr et de valeur, soit *addr = min(*addr, value).

rsAtomicOr : thread sécurisé au niveau du bit ou

int32_t rsAtomicOr(volatile int32_t* addr, valeur int32_t); Ajouté au niveau d'API 14
int32_t rsAtomicOr(volatile uint32_t* addr, valeur uint32_t); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à modifier.
valueValeur vers ou avec.
Renvoie
Valeur de *addr avant l'opération.

Exécuter atomiquement une ou deux valeurs au niveau du bit, en stockant le résultat au niveau de l'adresse addr, par exemple *addr |= value.

rsAtomicSub : soustraction sécurisée

int32_t rsAtomicSub(valeur volatile int32_t* addr, int32_t); Ajouté au niveau d'API 14
int32_t rsAtomicSub(valeur volatile uint32_t* addr, uint32_t); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à modifier.
valueMontant à soustraire.
Renvoie
Valeur de *addr avant l'opération.

Soustrait atomiquement une valeur de la valeur au point d'addition, c'est-à-dire *addr -= value.

rsAtomicXor : exclusivité bit à bit ou thread sécurisé

int32_t rsAtomicXor(volatile int32_t* addr, valeur int32_t); Ajouté au niveau d'API 14
int32_t rsAtomicXor(volatile uint32_t* addr, valeur uint32_t); Ajouté au niveau d'API 20
Paramètres
AddrAdresse de la valeur à modifier.
valueValeur avec xor.
Renvoie
Valeur de *addr avant l'opération.

Effectue atomiquement un xor bit à bit de deux valeurs, en stockant le résultat au niveau de l'addition, par exemple *addr ^= value.