Funkcje aktualizacji atomowej w RenderScript

Przegląd

Aby zaktualizować wartości udostępniane w wielu wątkach, użyj poniższych funkcji. Zapewniają one aktualizację atomową wartości, co oznacza, że pamięć odczyty, aktualizacje i zapis są wykonywane we właściwej kolejności.

Te funkcje są wolniejsze od ich nieatomowych odpowiedników, więc używaj ich tylko wtedy, gdy potrzebna jest synchronizacja.

Pamiętaj, że w kodzie RenderScript Twój kod może działać w oddzielnych wątkach, nawet jeśli nie został on utworzony przez Ciebie. Środowisko wykonawcze RenderScript bardzo często dzieli wykonanie jednego jądra na wiele wątków. Globalne aktualizowanie musi być przeprowadzane za pomocą funkcji niepodzielnych. Jeśli to możliwe, zmień algorytm tak, aby całkowicie ich unikać.

Podsumowanie

Funkcje
rsAtomicAdd, Dodawanie bezpieczne w wątku
rsAtomicAnd Bezpieczne do użycia w wątkach
rsAtomicCas, Porównywanie i konfigurowanie w wątku
rsAtomicDec Zmniejszanie bezpieczne w wątku
rsAtomicInc, Zwiększenie bezpieczeństwa w wątku
rsAtomicMax, Maksymalna dozwolony w wątku
rsAtomicMin, Minimalna możliwa do zastosowania w wątku
rsAtomicOr, Bezpieczne w wątku bitowe lub
rsAtomicSub, Odejmowanie w wątkach
rsAtomicXor Tylko bitowe zabezpieczenia w wątkach lub

Funkcje

rsAtomicAdd : dodawanie bezpieczne w wątku

int32_t rsAtomicAdd(volatile int32_t* addr, wartość int32_t); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do zmiany.
wartośćKwota do dodania.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomicly dodaje wartość do wartości w addr, tj. *addr += value.

rsAtomicAnd : bezpieczne w wątkach i funkcje bitowe

int32_t rsAtomicAnd(volatile int32_t* addr, int32_t value); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do zmiany.
wartośćKorzyści
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomic wykonuje zadanie bitowe na 2 wartości, zapisując wynik z powrotem w elemencie addr, tj. *addr &= value.

rsAtomicCas : porównanie i ustawienie w przypadku użycia w wątkach

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); Dodano do poziomu interfejsu API 14.
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); Dodano do poziomu interfejsu API 14.
Parametry
addrAdres wartości do porównania i zastąpienia, jeśli test zakończy się pomyślnie.
porównywanie wartościWartość do przetestowania *addr.
nowa wartośćWartość do zapisania, jeśli test się zakończy.
Zwroty
Wartość *addr przed wykonaniem operacji.

Jeśli wartość w obiekcie addr jest zgodna z wartością matchingValue, nowa wartość jest zapisywana w metodzie addr, tj. if (*addr == compareValue) { *addr = newValue; }.

Aby sprawdzić, czy wartość została zapisana, sprawdź, czy wartość zwrócona przez funkcję rsAtomicCas() ma wartość allowValue.

rsAtomicDec : zmniejszenie w wątku

int32_t rsAtomicDec(volatile int32_t* addr); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicDec(volatile uint32_t* addr); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do zmniejszania.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomic odejmuje 1 od wartości przy addr. Jest to odpowiednik rsAtomicSub(addr, 1).

rsAtomicInc : przyrost w wątku

int32_t rsAtomicInc(volatile int32_t* addr); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicInc(volatile uint32_t* addr); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do przyrostu.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomic dodaje jeden do wartości w atrybucie addr. Jest to odpowiednik rsAtomicAdd(addr, 1).

rsAtomicMax : maksimum w wątkach

int32_t rsAtomicMax(volatile int32_t* addr, int32_t value); Dodano do poziomu interfejsu API 14.
uint32_t rsAtomicMax(volatile uint32_t* addr, uint32_t value); Dodano do poziomu interfejsu API 14.
Parametry
addrAdres wartości do zmiany.
wartośćWartość porównawcza.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomicly ustawia wartość argumentu addr na maksymalną wartość z parametru *addr i wartości, tj. *addr = max(*addr, value).

rsAtomicMin : minimalna wartość zapewniająca bezpieczeństwo w wątku

int32_t rsAtomicMin(volatile int32_t* addr, int32_t value); Dodano do poziomu interfejsu API 14.
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t value); Dodano do poziomu interfejsu API 14.
Parametry
addrAdres wartości do zmiany.
wartośćWartość porównawcza.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomicly ustawia wartość argumentu addr na minimalną wartość *addr and value, tj. *addr = min(*addr, value).

rsAtomicOr : bezpieczne w wątku, bitowe lub

int32_t rsAtomicOr(volatile int32_t* addr, int32_t value); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do zmiany.
wartośćWartość do lub z.
Zwroty
Wartość *addr przed wykonaniem operacji.

Wykonaj działanie bitowe lub 2 wartości, przechowując wynik jako addr, np. *addr |= value.

rsAtomicSub : odejmowanie w wątkach

int32_t rsAtomicSub(volatile int32_t* addr, int32_t value); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicSub(lotny uint32_t* addr, wartość uint32_t); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do zmiany.
wartośćKwota do odjęcia.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomic odejmuje wartość od wartości w punkcie dodawania, tj. *addr -= value.

rsAtomicXor : tylko dla bezpieczeństwa w wątkach lub tylko

int32_t rsAtomicXor(volatile int32_t* addr, int32_t value); Dodano do poziomu interfejsu API 14.
int32_t rsAtomicXor(lotny uint32_t* addr, wartość uint32_t); Dodano do poziomu interfejsu API 20
Parametry
addrAdres wartości do zmiany.
wartośćWartość xor.
Zwroty
Wartość *addr przed wykonaniem operacji.

Atomic wykonuje xor bitowy 2 wartości, zapisując wynik jako addr, tj. *addr ^= value.