Fungsi Update Atom RenderScript

Ringkasan

Untuk memperbarui nilai yang dibagikan di antara beberapa thread, gunakan fungsi di bawah. Cara ini memastikan bahwa nilai diupdate secara atomik, yaitu memori membaca, update, dan penulisan memori dilakukan dalam urutan yang benar.

Fungsi ini lebih lambat daripada fungsi non-atomik yang setara, jadi gunakan hanya saat sinkronisasi diperlukan.

Perlu diperhatikan bahwa di RenderScript, kode Anda kemungkinan akan berjalan di thread terpisah meskipun Anda tidak membuatnya secara eksplisit. Runtime RenderScript akan sangat sering membagi eksekusi satu kernel ke beberapa thread. Mengupdate global harus dilakukan dengan fungsi atomik. Jika memungkinkan, ubah algoritma Anda untuk menghindarinya sama sekali.

Ringkasan

Fungsi
rsAtomicAdd Penambahan thread aman
rsAtomicAnd Bitwise yang aman untuk thread dan
rsAtomicCas Pembandingan dan setelan yang aman untuk thread
rsAtomicDec Pengurangan yang aman untuk thread
rsAtomicInc Penambahan yang aman untuk thread
rsAtomicMax Maksimum aman untuk thread
rsAtomicMin Minimum aman untuk thread
rsAtomicOr Bitwise atau thread-safe thread
rsAtomicSub Pengurangan yang aman untuk thread
rsAtomicXor Eksklusif atau khusus untuk thread yang aman

Fungsi

rsAtomicAdd : Penambahan yang aman untuk thread

int32_t rsAtomicAdd(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
int32_t rsAtomicAdd(volatile uint32_t* addr, nilai uint32_t); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan diubah.
nilaiJumlah yang akan ditambahkan.
Hasil
Nilai *addr sebelum operasi.

Menambahkan nilai secara atomik ke nilai pada penjumlahan, yaitu *addr += value.

rsAtomicAnd : Bitwise yang aman untuk thread dan

int32_t rsAtomicAnd(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
int32_t rsAtomicAnd(volatile uint32_t* addr, nilai uint32_t); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan diubah.
nilaiNilai bagi dan dengan.
Hasil
Nilai *addr sebelum operasi.

Secara atomik melakukan bitwise dan dua nilai, menyimpan hasilnya kembali di addr, yaitu *addr &= value.

rsAtomicCas : Pembandingan dan penetapan yang aman untuk thread

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); Ditambahkan di API level 14
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); Ditambahkan di API level 14
Parameter
AddrAlamat nilai yang akan dibandingkan dan diganti jika pengujian lulus.
Bandingkan NilaiNilai untuk diuji *addr.
nilaibaruNilai yang akan ditulis jika pengujian lulus.
Hasil
Nilai *addr sebelum operasi.

Jika nilai di addr cocok dengancompareValue, newValue itu akan ditulis di addr, yaitu if (*addr == compareValue) { *addr = newValue; }.

Anda dapat memeriksa apakah nilai tersebut ditulis dengan memeriksa apakah nilai yang ditampilkan oleh rsAtomicCas() adalahcompareValue.

rsAtomicDec : Pengurangan yang aman untuk thread

int32_t rsAtomicDec(volatile int32_t* addr); Ditambahkan di API level 14
int32_t rsAtomicDec(volatile uint32_t* addr); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan dikurangi.
Hasil
Nilai *addr sebelum operasi.

Secara atomik mengurangi satu dari nilai pada penjumlahan. Fungsi ini setara dengan rsAtomicSub(addr, 1).

rsAtomicInc : Penambahan yang aman untuk thread

int32_t rsAtomicInc(volatile int32_t* addr); Ditambahkan di API level 14
int32_t rsAtomicInc(volatile uint32_t* addr); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan bertambah.
Hasil
Nilai *addr sebelum operasi.

Menambahkan satu secara atomik ke nilai saat penjumlahan. Fungsi ini setara dengan rsAtomicAdd(addr, 1).

rsAtomicMax : Maksimum yang aman untuk thread

int32_t rsAtomicMax(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
uint32_t rsAtomicMax(volatile uint32_t* addr, nilai uint32_t); Ditambahkan di API level 14
Parameter
AddrAlamat nilai yang akan diubah.
nilaiNilai perbandingan.
Hasil
Nilai *addr sebelum operasi.

Secara atomik menetapkan nilai pada penjumlah ke nilai maksimum *penambahan dan nilai, yaitu *addr = max(*addr, value).

rsAtomicMin : Minimum aman untuk thread

int32_t rsAtomicMin(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t); Ditambahkan di API level 14
Parameter
AddrAlamat nilai yang akan diubah.
nilaiNilai perbandingan.
Hasil
Nilai *addr sebelum operasi.

Secara atomik menetapkan nilai pada penjumlahan ke minimum *penambahan dan nilai, yaitu *addr = min(*addr, value).

rsAtomicOr : Bitwise yang aman untuk thread atau

int32_t rsAtomicOr(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
int32_t rsAtomicOr(volatile uint32_t* addr, nilai uint32_t); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan diubah.
nilaiNilai ke atau dengan.
Hasil
Nilai *addr sebelum operasi.

Secara atomik melakukan satu atau dua nilai bitwise, menyimpan hasilnya di addr, yaitu *addr |= value.

rsAtomicSub : Pengurangan yang aman untuk thread

int32_t rsAtomicSub(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
int32_t rsAtomicSub(volatile uint32_t* addr, nilai uint32_t); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan diubah.
nilaiJumlah yang akan dikurangi.
Hasil
Nilai *addr sebelum operasi.

Mengurangi nilai secara atomik dari nilai pada penjumlahan, yaitu *addr -= value.

rsAtomicXor : Eksklusif untuk thread yang aman untuk thread atau

int32_t rsAtomicXor(volatile int32_t* addr, nilai int32_t); Ditambahkan di API level 14
int32_t rsAtomicXor(volatile uint32_t* addr, nilai uint32_t); Ditambahkan di API level 20
Parameter
AddrAlamat nilai yang akan diubah.
nilaiNilai untuk dijalankan.
Hasil
Nilai *addr sebelum operasi.

Secara atomik melakukan xor bitwise dari dua nilai, menyimpan hasilnya di addr, yaitu *addr ^= value.