Funções de atualização atômicas do RenderScript

Visão geral

Para atualizar valores compartilhados entre várias linhas de execução, use as funções abaixo. Eles garantem que os valores sejam atualizados atomicamente, ou seja, que as leituras, atualizações e gravações da memória sejam feitas na ordem correta.

Essas funções são mais lentas que as equivalentes não atômicas. Portanto, use-as apenas quando a sincronização for necessária.

No RenderScript, o código provavelmente será executado em linhas de execução separadas, mesmo que você não as tenha criado explicitamente. O ambiente de execução do RenderScript costuma dividir a execução de um kernel em várias linhas de execução. A atualização de globais precisa ser feita com funções atômicas. Se possível, modifique seu algoritmo para evitá-los completamente.

Resumo

Funções
rsAtomicAdd (link em inglês) Adição segura de linha de execução
rsAtomicAnd (em inglês) Segurança de encadeamento bit a bit e
rsAtomicCas (em inglês) Comparação e definição segura para linhas de execução
rsAtomicDec (link em inglês) Redução segura de linha de execução
rsAtomicInc (link em inglês) Incremento seguro para thread
rsAtomicMax (em inglês) Máximo seguro de linha de execução
rsAtomicMin (link em inglês) Mínimo seguro para linha de execução
rsAtomicOr (link em inglês) Segurança de thread bit a bit ou
rsAtomicSub (em inglês) Subtração segura de linhas de execução
rsAtomicXor (em inglês) Exclusividade de bit a bit seguro para thread

Funções

rsAtomicAdd : adição segura para linhas de execução

int32_t rsAtomicAdd(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
int32_t rsAtomicAdd(volatile uint32_t* addr, valor uint32_t); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor a adicionar.
Retorna
Valor de *addr antes da operação.

Adiciona atômicamente um valor ao valor em addr, ou seja, *addr += value.

rsAtomicAnd : seguro para linha de execução bit a bit e

int32_t rsAtomicAnd(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
int32_t rsAtomicAnd(volatile uint32_t* addr, valor uint32_t); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor para e com.
Retorna
Valor de *addr antes da operação.

Realiza atômicamente bit a bit e de dois valores, armazenando o resultado de volta em addr, ou seja, *addr &= value.

rsAtomicCas : comparação e definição segura para linhas de execução

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); Adicionado no nível 14 da API.
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); Adicionado no nível 14 da API.
Parâmetros
AddrEndereço do valor a ser comparado e substituído se o teste for aprovado.
compareValueValor com o qual testar *addr.
valor novoValor a ser gravado se o teste for aprovado.
Retorna
Valor de *addr antes da operação.

Se o valor em addr corresponder a compareValue, o newValue será gravado em addr, ou seja, if (*addr == compareValue) { *addr = newValue; }.

Verifique se o valor foi gravado verificando se o valor retornado por rsAtomicCas() é compareValue.

rsAtomicDec : decremento seguro para linhas de execução

int32_t rsAtomicDec(volatile int32_t* addr); Adicionado no nível 14 da API.
int32_t rsAtomicDec(volatile uint32_t* addr); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser diminuído.
Retorna
Valor de *addr antes da operação.

Subtrai atômicamente um do valor na soma. É equivalente a rsAtomicSub(addr, 1).

rsAtomicInc : incremento seguro para linhas de execução

int32_t rsAtomicInc(volatile int32_t* addr); Adicionado no nível 14 da API.
int32_t rsAtomicInc(volatile uint32_t* addr); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser incrementado.
Retorna
Valor de *addr antes da operação.

Adiciona atômicamente um ao valor em addr. É equivalente a rsAtomicAdd(addr, 1).

rsAtomicMax : máximo seguro para linhas de execução

int32_t rsAtomicMax(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
uint32_t rsAtomicMax(volatile uint32_t* addr, valor uint32_t); Adicionado no nível 14 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor de comparação.
Retorna
Valor de *addr antes da operação.

Define atômicamente o valor em addr como o máximo de *addr e valor, ou seja, *addr = max(*addr, value).

rsAtomicMin : mínimo seguro para linha de execução

int32_t rsAtomicMin(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
uint32_t rsAtomicMin(volatile uint32_t* addr, valor uint32_t); Adicionado no nível 14 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor de comparação.
Retorna
Valor de *addr antes da operação.

Define atômicamente o valor em addr ao mínimo de *addr e value, ou seja, *addr = min(*addr, value).

rsAtomicOr : segurança de linha de execução bit a bit ou

int32_t rsAtomicOr(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor para ou com.
Retorna
Valor de *addr antes da operação.

Executar atômicamente um ou dois valores bit a bit, armazenando o resultado em addr, ou seja, *addr |= value.

rsAtomicSub : subtração segura de linhas de execução

int32_t rsAtomicSub(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
int32_t rsAtomicSub(volatile uint32_t* addr, valor uint32_t); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor a ser subtraído.
Retorna
Valor de *addr antes da operação.

Subtrai atômicamente um valor do valor no somador, ou seja, *addr -= value.

rsAtomicXor : exclusivo bit a bit seguro para thread ou

int32_t rsAtomicXor(volatile int32_t* addr, valor int32_t); Adicionado no nível 14 da API.
int32_t rsAtomicXor(volatile uint32_t* addr, uint32_t value); Adicionado no nível 20 da API.
Parâmetros
AddrEndereço do valor a ser modificado.
valueValor a ser usado.
Retorna
Valor de *addr antes da operação.

Executa atômicamente um xor bit a bit de dois valores, armazenando o resultado em addr, ou seja, *addr ^= value.