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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
Parâmetros
Addr | Endereço do valor a ser comparado e substituído se o teste for aprovado. |
compareValue | Valor com o qual testar *addr. |
valor novo | Valor 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
Parâmetros
Addr | Endereç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
Parâmetros
Addr | Endereç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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
Parâmetros
Addr | Endereço do valor a ser modificado. |
value | Valor 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
.