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é
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Montant à 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
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Valeur 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
Paramètres
Addr | Adresse de la valeur à comparer et à remplacer si le test réussit. |
compareValue | Valeur à utiliser pour tester *addr. |
nouvelleValeur | Valeur à é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
Paramètres
Addr | Adresse 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é
Paramètres
Addr | Adresse 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é
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Valeur 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é
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Valeur 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
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Valeur 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
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Montant à 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é
Paramètres
Addr | Adresse de la valeur à modifier. |
value | Valeur 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
.