개요
여러 스레드 간에 공유되는 값을 업데이트하려면 아래 함수를 사용합니다. 메모리 읽기, 업데이트, 메모리 쓰기가 올바른 순서로 실행되도록 값이 원자적으로 업데이트되도록 합니다.
이러한 함수는 원자적이지 않은 함수보다 느리므로 동기화가 필요한 경우에만 사용합니다.
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 | 수정할 값의 주소입니다. |
---|---|
value | xor로 사용할 값입니다. |
반환 값
연산 전의 *addr 값 |
두 값의 비트별 xor를 원자적으로 실행하여 addr에 결과를 저장합니다(예: *addr ^= value
).