RenderScript 원자 업데이트 함수

개요

여러 스레드 간에 공유되는 값을 업데이트하려면 아래 함수를 사용합니다. 메모리 읽기, 업데이트, 메모리 쓰기가 올바른 순서로 실행되도록 값이 원자적으로 업데이트되도록 합니다.

이러한 함수는 원자적이지 않은 함수보다 느리므로 동기화가 필요한 경우에만 사용합니다.

RenderScript에서는 코드를 명시적으로 만들지 않았더라도 코드가 별도의 스레드에서 실행될 수 있습니다. RenderScript 런타임은 종종 한 커널의 실행을 여러 스레드에 분할합니다. 전역 함수는 원자 함수를 사용하여 업데이트해야 합니다. 가능하면 알고리즘을 수정하여 모두 피하세요.

요약

함수
rsAtomicAdd 스레드로부터 안전한 추가
rsAtomicAnd 스레드로부터 안전한 비트 및
rsAtomicCas 스레드로부터 안전한 비교 및 설정
rsAtomicDec 스레드로부터 안전한 감소
rsAtomicInc 스레드로부터 안전한 증분
rsAtomicMax 스레드로부터 안전한 최댓값
rsAtomicMin 스레드로부터 안전한 최솟값
rsAtomicOr 스레드로부터 안전한 비트 또는
rsAtomicSub 스레드로부터 안전한 뺄셈
rsAtomicXor 스레드로부터 안전한 비트 전용 또는

함수

rsAtomicAdd : 스레드 안전 추가

int32_t rsAtomicAdd(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); API 수준 20에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
value추가할 금액입니다.
반환 값
연산 전의 *addr 값

addr의 값에 원자적으로 값을 추가합니다(예: *addr += value).

rsAtomicAnd : 스레드로부터 안전한 비트 단위입니다.

int32_t rsAtomicAnd(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); API 수준 20에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
value사용할 값입니다.
반환 값
연산 전의 *addr 값

두 값의 비트 단위로 원자적으로 수행하며, 결과를 addr에 다시 저장합니다(예: *addr &= value).

rsAtomicCas : 스레드로부터 안전한 비교 및 설정

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); API 수준 14에 추가되었습니다.
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); API 수준 14에 추가되었습니다.
매개변수
addr테스트를 통과한 경우 비교하고 대체할 값의 주소입니다.
비교값*추가로 테스트할 값입니다.
새 값테스트에 통과한 경우 쓸 값입니다.
반환 값
연산 전의 *addr 값

addr의 값이compareValue와 일치하면 addr에 newValue가 작성됩니다(예: if (*addr == compareValue) { *addr = newValue; }).

rsAtomicCas()에서 반환된 값이compareValue인지 확인하면 값이 작성되었는지를 확인할 수 있습니다.

rsAtomicDec : 스레드로부터 안전한 감소

int32_t rsAtomicDec(volatile int32_t* addr); API 수준 14에 추가되었습니다.
int32_t rsAtomicDec(volatile uint32_t* addr); API 수준 20에 추가되었습니다.
매개변수
addr감소시킬 값의 주소입니다.
반환 값
연산 전의 *addr 값

덧셈의 값에서 원자적으로 1을 뺍니다. rsAtomicSub(addr, 1)과 동일합니다.

rsAtomicInc : 스레드로부터 안전한 증분

int32_t rsAtomicInc(volatile int32_t* addr); API 수준 14에 추가되었습니다.
int32_t rsAtomicInc(volatile uint32_t* addr); API 수준 20에 추가되었습니다.
매개변수
addr증분할 값의 주소입니다.
반환 값
연산 전의 *addr 값

addr의 값에 원자적으로 하나를 더합니다. rsAtomicAdd(addr, 1)과 동일합니다.

rsAtomicMax : 스레드로부터 안전한 최댓값

int32_t rsAtomicMax(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
uint32_t rsAtomicMax(volatile uint32_t* addr, uint32_t value); API 수준 14에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
value비교 값입니다.
반환 값
연산 전의 *addr 값

addr의 값을 *addr과 value의 최댓값(예: *addr = max(*addr, value))으로 원자적으로 설정합니다.

rsAtomicMin : 스레드로부터 안전한 최솟값

int32_t rsAtomicMin(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t value); API 수준 14에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
value비교 값입니다.
반환 값
연산 전의 *addr 값

addr의 값을 *addr과 value의 최솟값(예: *addr = min(*addr, value))으로 원자적으로 설정합니다.

rsAtomicOr : 스레드로부터 안전한 비트 단위 또는

int32_t rsAtomicOr(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); API 수준 20에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
value값이 같거나 같거나 이입니다.
반환 값
연산 전의 *addr 값

비트 또는 두 개의 값을 원자적으로 실행하여 결과를 addr에 저장합니다(예: *addr |= value).

rsAtomicSub : 스레드 안전 뺄셈

int32_t rsAtomicSub(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
int32_t rsAtomicSub(volatile uint32_t* addr, uint32_t value); API 수준 20에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
value차감할 금액입니다.
반환 값
연산 전의 *addr 값

가산의 값에서 원자적으로 값을 뺍니다(예: *addr -= value).

rsAtomicXor : 스레드로부터 안전한 비트 전용 또는

int32_t rsAtomicXor(volatile int32_t* addr, int32_t value); API 수준 14에 추가되었습니다.
int32_t rsAtomicXor(volatile uint32_t* addr, uint32_t value); API 수준 20에 추가되었습니다.
매개변수
addr수정할 값의 주소입니다.
valuexor로 사용할 값입니다.
반환 값
연산 전의 *addr 값

두 값의 비트별 xor를 원자적으로 실행하여 addr에 결과를 저장합니다(예: *addr ^= value).