RenderScript Atomik Güncelleme İşlevleri

Genel bakış

Birden fazla iş parçacığı arasında paylaşılan değerleri güncellemek için aşağıdaki işlevleri kullanın. Değerlerin atomik olarak güncellenmesini, yani bellek okumalarının, güncellemelerin ve bellek yazmalarının doğru sırada yapılmasını sağlarlar.

Bu işlevler, atomik olmayan eşdeğerlerinden daha yavaştır. Bu nedenle, bunları yalnızca senkronizasyon gerektiğinde kullanın.

RenderScript'te, açık bir şekilde oluşturmamış olsanız bile kodunuzun büyük olasılıkla ayrı iş parçacıkları halinde çalışacağını unutmayın. RenderScript çalışma zamanı genellikle bir çekirdeğin yürütülmesini birden fazla iş parçacığına böler. Genel güncelleme işlemi atomik işlevlerle yapılmalıdır. Mümkünse bunların tamamen önlenmesi için algoritmanızı değiştirin.

Özet

Fonksiyonlar
rsAtomicAdd İleti dizisinde güvenli ekleme
rsAtomicAnd İş parçacığı güvenli bit tabanlı ve
rsAtomicCas İş parçacığı güvenli karşılaştırma ve ayarlama
rsAtomicDec İş parçacığı güvenli düşüş
rsAtomicInc İş parçacığı güvenli artım
rsAtomicMax İş parçacığı güvenli maksimum
rsAtomicMin İş parçacığı güvenli minimum
rsAtomicOr İş parçacığı açısından güvenli bit tabanlı veya
rsAtomicSub İleti dizisinde güvenli çıkarma
rsAtomicXor İş parçacığı güvenli bit tabanlı özel veya

Fonksiyonlar

rsAtomicAdd : İş parçacığı güvenli ekleme

int32_t rsAtomicAdd(volatile int32_t* addr, int32_t değeri); API düzeyi 14'te eklendi
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t değeri); API düzeyi 20'de eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueEklenecek tutar.
İlerlemeler
İşlemden önceki *addr değeri.

Atomicly, addr’daki değere bir değer ekler, ör. *addr += value.

rsAtomicAnd : İş parçacığı güvenli bit tabanlı ve

int32_t rsAtomicAnd(volatile int32_t* adr, int32_t değeri); API düzeyi 14'te eklendi
int32_t rsAtomicAnd(volatile uint32_t* adr, uint32_t değeri); API düzeyi 20'de eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueKullanılan ve uygulanan değer.
İlerlemeler
İşlemden önceki *addr değeri.

Atomicly iki değerden oluşan bit tabanlı bir işlem gerçekleştirir ve sonucu alıcıda tekrar depolar (ör. *addr &= value).

rsAtomicCas : İş parçacığı güvenli karşılaştırma ve ayarlama

int32_t rsAtomicCas(değişken int32_t* addr, int32_t meetValue, int32_t newValue); API düzeyi 14'te eklendi
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t matchingValue, uint32_t newValue); API düzeyi 14'te eklendi
Parametreler
adrTestin başarılı olması durumunda karşılaştırılacak ve değiştirilecek değerin adresi.
karşılaştırmaDeğeri*addr ile karşılaştırılacak değer.
yeniDeğerTestin başarılı olması durumunda yazılacak değer.
İlerlemeler
İşlemden önceki *addr değeri.

Adr öğesindeki değer karşılaştırValue ile eşleşirse newValue, addr değerine yazılır (ör. if (*addr == compareValue) { *addr = newValue; }).

rsAtomicCas() tarafından döndürülen değerinComparisonValue olup olmadığını kontrol ederek değerin yazılıp yazılmadığını kontrol edebilirsiniz.

rsAtomicDec : İş parçacığı güvenli azalma

int32_t rsAtomicDec(volatile int32_t* addr); API düzeyi 14'te eklendi
int32_t rsAtomicDec(volatile uint32_t* addr); API düzeyi 20'de eklendi
Parametreler
adrAzaltılacak değerin adresi.
İlerlemeler
İşlemden önceki *addr değeri.

Atomik olarak addaki değerden bir çıkarır. Bu, rsAtomicSub(addr, 1) işlevine eşdeğerdir.

rsAtomicInc : İş parçacığı güvenli artış

int32_t rsAtomicInc(değişken int32_t* adresr); API düzeyi 14'te eklendi
int32_t rsAtomicInc(değişken uint32_t* adresr); API düzeyi 20'de eklendi
Parametreler
adrArtırılacak değerin adresi.
İlerlemeler
İşlemden önceki *addr değeri.

Atomik olarak adrdaki değere bir tane ekler. Bu, rsAtomicAdd(addr, 1) işlevine eşdeğerdir.

rsAtomicMax : İş parçacığı güvenli maksimum

int32_t rsAtomicMax(değişken int32_t* adr, int32_t değeri); API düzeyi 14'te eklendi
uint32_t rsAtomicMax(değişken uint32_t* adr, uint32_t değeri); API düzeyi 14'te eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueKarşılaştırma değeri.
İlerlemeler
İşlemden önceki *addr değeri.

Atomicly, addr’daki değeri en yüksek *addr ve value (ör. *addr = max(*addr, value)) değerine ayarlar.

rsAtomicMin : İş parçacığı güvenli minimum

int32_t rsAtomicMin(değişken int32_t* adr, int32_t değeri); API düzeyi 14'te eklendi
uint32_t rsAtomicMin(değişken uint32_t* adr, uint32_t değeri); API düzeyi 14'te eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueKarşılaştırma değeri.
İlerlemeler
İşlemden önceki *addr değeri.

Atomicly, addr’daki değeri en düşük *addr ve value değerine ayarlar, ör. *addr = min(*addr, value).

rsAtomicOr : İş parçacığı güvenli bit tabanlı veya

int32_t rsAtomicOr(değişken int32_t* adr, int32_t değeri); API düzeyi 14'te eklendi
int32_t rsAtomicOr(değişken uint32_t* adr, uint32_t değeri); API düzeyi 20'de eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueKullanılacak veya hariç tutulacak değer.
İlerlemeler
İşlemden önceki *addr değeri.

Atomik olarak bit tabanlı veya iki değer uygulayarak sonucu alıcıda (ör. *addr |= value) saklar.

rsAtomicSub : İş parçacığında güvenli çıkarma

int32_t rsAtomicSub(değişken int32_t* adr, int32_t değeri); API düzeyi 14'te eklendi
int32_t rsAtomicSub(değişken uint32_t* adr, uint32_t değeri); API düzeyi 20'de eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueçıkarılacak tutar.
İlerlemeler
İşlemden önceki *addr değeri.

Atomik olarak, alıcıdaki değerden bir değeri çıkarır, ör. *addr -= value.

rsAtomicXor : İş parçacığı güvenli bit tabanlı özel veya

int32_t rsAtomicXor(değişken int32_t* adr, int32_t değeri); API düzeyi 14'te eklendi
int32_t rsAtomicXor(değişken uint32_t* addr, uint32_t değeri); API düzeyi 20'de eklendi
Parametreler
adrDeğiştirilecek değerin adresi.
valueXorlanacak değer.
İlerlemeler
İşlemden önceki *addr değeri.

Atomicly, iki değerin bit tabanlı xor işlemlerini yaparak sonucu alıcıda depolar (ör. *addr ^= value).