Funciones de actualización atómica de RenderScript

Descripción general

Usa las siguientes funciones para actualizar valores compartidos entre varios subprocesos. Garantizan que los valores se actualicen de forma atómica, es decir, que la memoria lea, las actualizaciones y las escrituras de memoria se realicen en el orden correcto.

Estas funciones son más lentas que sus equivalentes no atómicos, por lo que solo debes usarlas cuando se necesite sincronización.

Ten en cuenta que, en RenderScript, es probable que tu código se ejecute en subprocesos separados, aunque no los hayas creado explícitamente. El entorno de ejecución de RenderScript con frecuencia dividirá la ejecución de un kernel en varios subprocesos. La actualización de los globales debe hacerse con funciones atómicas. Si es posible, modifica el algoritmo para evitarlos por completo.

Resumen

Funciones
rsAtomicAdd. Adición segura para subprocesos
rsAtomicAnd. A nivel de bits y con seguridad para subprocesos
rsAtomicCas Comparación y configuración de subprocesos seguros
rsAtomicDec; Disminución segura para subprocesos
rsAtomicInc. Incremento seguro para subprocesos
rsAtomicMax; Máximo de seguridad para subprocesos
rsAtomicMin Mínimo de seguridad para subprocesos
rsAtomicOr o a nivel de bits seguro para subprocesos
rsAtomicSub. Resta de subprocesos seguros
rsAtomicXor. Exclusivo a nivel de bits seguro para subprocesos

Funciones

rsAtomicAdd : Adición segura para subprocesos

int32_t rsAtomicAdd(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se modificará.
valorImporte para agregar
Devuelve
Valor de *addr antes de la operación.

Agrega de forma atómica un valor al valor en addr, es decir, *addr += value.

rsAtomicAnd : a nivel de bits y con protección de subprocesos

int32_t rsAtomicAnd(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se modificará.
valorValor para y con.
Devuelve
Valor de *addr antes de la operación.

Realiza atómicamente un bit a bit y de dos valores, y almacena el resultado en addr, es decir, *addr &= value.

rsAtomicCas : Comparación y configuración de subprocesos seguros

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); Se agregó en el nivel de API 14.
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); Se agregó en el nivel de API 14.
Parámetros
direcciónDirección del valor que se comparará y reemplazará si se aprueba la prueba.
compararValorValor con el que se realizará la prueba *.
ValornuevoValor que se escribirá si se aprueba la prueba.
Devuelve
Valor de *addr antes de la operación.

Si el valor en addr coincide con comparaValue, entonces el newValue se escribe en addr, es decir, if (*addr == compareValue) { *addr = newValue; }.

Para comprobar que el valor se escribió, comprueba que el valor que muestra rsAtomicCas() sea compararValue.

rsAtomicDec : disminución de seguridad de subprocesos

int32_t rsAtomicDec(volatile int32_t* addr); Se agregó en el nivel de API 14.
int32_t rsAtomicDec(volatile uint32_t* addr); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se disminuirá.
Devuelve
Valor de *addr antes de la operación.

Resta de forma atómica uno del valor en la dirección. Esto equivale a rsAtomicSub(addr, 1).

rsAtomicInc : Incremento seguro para subprocesos

int32_t rsAtomicInc(volatile int32_t* addr); Se agregó en el nivel de API 14.
int32_t rsAtomicInc(volatile uint32_t* addr); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se va a incrementar.
Devuelve
Valor de *addr antes de la operación.

Suma uno de forma atómica al valor a la dirección. Esto equivale a rsAtomicAdd(addr, 1).

rsAtomicMax : máximo seguro para subprocesos

int32_t rsAtomicMax(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
uint32_t rsAtomicMax(volatile uint32_t* addr, uint32_t value); Se agregó en el nivel de API 14.
Parámetros
direcciónDirección del valor que se modificará.
valorValor de comparación.
Devuelve
Valor de *addr antes de la operación.

Establece de forma atómica el valor de addr al máximo de *addr y valor, es decir, *addr = max(*addr, value).

rsAtomicMin : Mínimo de seguridad para subprocesos

int32_t rsAtomicMin(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t value); Se agregó en el nivel de API 14.
Parámetros
direcciónDirección del valor que se modificará.
valorValor de comparación.
Devuelve
Valor de *addr antes de la operación.

Establece de forma atómica el valor a addr al mínimo de *addr y valor, es decir, *addr = min(*addr, value).

rsAtomicOr : a nivel de bits seguro para subprocesos o

int32_t rsAtomicOr(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se modificará.
valorValor con o con.
Devuelve
Valor de *addr antes de la operación.

Realiza de forma atómica uno o dos valores a nivel de bits y almacena el resultado en addr, es decir, *addr |= value.

rsAtomicSub : Resta segura para subprocesos

int32_t rsAtomicSub(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
int32_t rsAtomicSub(volatile uint32_t* addr, valor uint32_t); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se modificará.
valorImporte que se restará.
Devuelve
Valor de *addr antes de la operación.

Resta de forma atómica un valor del valor a addr, es decir, *addr -= value.

rsAtomicXor : Exclusivo para subprocesos a nivel de bits o

int32_t rsAtomicXor(volatile int32_t* addr, valor int32_t); Se agregó en el nivel de API 14.
int32_t rsAtomicXor(volatile uint32_t* addr, uint32_t value); Se agregó en el nivel de API 20.
Parámetros
direcciónDirección del valor que se modificará.
valorValor con el que se realizará xor.
Devuelve
Valor de *addr antes de la operación.

De forma atómica, realiza un xor a nivel de bits de dos valores y almacena el resultado en addr, es decir, *addr ^= value.