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 yang aman untuk thread
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Jumlah 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
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Nilai 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
Parameter
Addr | Alamat nilai yang akan dibandingkan dan diganti jika pengujian lulus. |
Bandingkan Nilai | Nilai untuk diuji *addr. |
nilaibaru | Nilai 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
Parameter
Addr | Alamat 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
Parameter
Addr | Alamat 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
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Nilai 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
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Nilai 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
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Nilai 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
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Jumlah 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
Parameter
Addr | Alamat nilai yang akan diubah. |
nilai | Nilai untuk dijalankan. |
Hasil
Nilai *addr sebelum operasi. |
Secara atomik melakukan xor bitwise dari dua nilai, menyimpan hasilnya di addr,
yaitu *addr ^= value
.