Hàm cập nhật nguyên tử RenderScript

Tổng quan

Để cập nhật các giá trị được chia sẻ giữa nhiều luồng, hãy sử dụng các hàm dưới đây. Chúng đảm bảo rằng các giá trị được cập nhật nguyên tử, tức là việc đọc bộ nhớ, cập nhật và ghi bộ nhớ được thực hiện theo đúng thứ tự.

Các hàm này chậm hơn các hàm tương đương không phải nguyên tử, vì vậy, chỉ sử dụng các hàm này khi cần đồng bộ hoá.

Xin lưu ý rằng trong RenderScript, mã của bạn có thể sẽ chạy trong các luồng riêng biệt mặc dù bạn không tạo các luồng đó một cách rõ ràng. Thời gian chạy RenderScript rất thường xuyên chia tách quá trình thực thi của một hạt nhân trên nhiều luồng. Bạn nên cập nhật tập lệnh toàn cục bằng các hàm nguyên tử. Nếu có thể, hãy sửa đổi thuật toán của bạn để tránh hoàn toàn chúng.

Tóm tắt

Hàm
rsAtomicAdd Thêm an toàn cho luồng
rs Nguyên tử và Bitwise an toàn cho luồng và
rsAtomicCas So sánh và thiết lập an toàn cho luồng
rsAtomicdec Giảm mức an toàn cho luồng
rsAtomicInc Tăng an toàn cho luồng
rsAtomicMax Tối đa an toàn cho luồng
rsAtomicMin Mức tối thiểu cho luồng an toàn
rsAtomicOr Bitwise an toàn cho luồng hoặc
rsAtomicSub Phép trừ an toàn cho luồng
rsAtomicXor Loại bitwise an toàn cho luồng hoặc

Hàm

rsAtomicAdd : Bổ sung an toàn cho luồng

int32_t rsAtomicAdd(volatile int32_t* addr, int32_t value); Đã thêm vào API cấp 14
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueSố tiền cần thêm.
Giá trị trả về
Giá trị của *addr trước thao tác.

Thêm một giá trị nguyên tử vào giá trị tại addr, tức là *addr += value.

rsAtomicAnd : Bitwise an toàn cho luồng và

int32_t rsAtomicAnd(volatile int32_t* addr, int32_t value); Đã thêm vào API cấp 14
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueGiá trị đối với và với.
Giá trị trả về
Giá trị của *addr trước thao tác.

Nguyên tử thực hiện một bitwise và hai giá trị, lưu trữ kết quả trở lại tại addr, tức là *addr &= value.

rsAtomicCas : So sánh và thiết lập an toàn cho luồng

int32_t rsAtomicCas(volatile int32_t* addr, int32_tcomparisonValue, int32_t newValue); Đã thêm vào API cấp 14
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_tcomparisonValue, uint32_t newValue); Đã thêm vào API cấp 14
Tham số
địa chỉ URLĐịa chỉ của giá trị cần so sánh và thay thế nếu kiểm thử thành công.
giá trị so sánhGiá trị để kiểm tra *addr.
giá trị mớiGiá trị cần ghi nếu kiểm thử thành công.
Giá trị trả về
Giá trị của *addr trước thao tác.

Nếu giá trị tại addr khớp với matchingValue, thì giá trị newValue sẽ được ghi là addr, tức là if (*addr == compareValue) { *addr = newValue; }.

Bạn có thể kiểm tra để đảm bảo giá trị đã được viết bằng cách kiểm tra để đảm bảo rằng giá trị mà rsAtomicCas() trả về là validValue.

rsAtomicDec : Giảm an toàn cho luồng

int32_t rsAtomicDec(volatile int32_t* addr); Đã thêm vào API cấp 14
int32_t rsAtomicDec(volatile uint32_t* addr); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị sẽ giảm.
Giá trị trả về
Giá trị của *addr trước thao tác.

Nguyên tử trừ một giá trị tại addr. Giá trị này tương đương với rsAtomicSub(addr, 1).

rsAtomicInc : Gia tăng an toàn cho luồng

int32_t rsAtomicInc(volatile int32_t* addr); Đã thêm vào API cấp 14
int32_t rsAtomicInc(volatile uint32_t* addr); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị cần tăng.
Giá trị trả về
Giá trị của *addr trước thao tác.

Thêm một phần tử vào giá trị tại addr. Giá trị này tương đương với rsAtomicAdd(addr, 1).

rsAtomicMax : Tối đa an toàn cho luồng

int32_t rsAtomicMax(giá trị int32_t* volatile, giá trị int32_t); Đã thêm vào API cấp 14
uint32_t rsAtomicMax(giá trị uint32_t* dễ biến động, giá trị uint32_t); Đã thêm vào API cấp 14
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueGiá trị so sánh.
Giá trị trả về
Giá trị của *addr trước thao tác.

Đặt giá trị tại addr thành tối đa là *addr và value, tức là *addr = max(*addr, value).

rsAtomicMin : Mức tối thiểu an toàn cho luồng

int32_t rsAtomicMin(volatile int32_t* addr, int32_t value); Đã thêm vào API cấp 14
uint32_t rsAtomicMin(biến động uint32_t* addr, uint32_t giá trị); Đã thêm vào API cấp 14
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueGiá trị so sánh.
Giá trị trả về
Giá trị của *addr trước thao tác.

Đặt giá trị tại addr thành mức tối thiểu của *addr và value, tức là *addr = min(*addr, value).

rsAtomicOr : Bitwise an toàn cho luồng hoặc

int32_t rsAtomicOr(volatile int32_t* addr, int32_t value); Đã thêm vào API cấp 14
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueGiá trị đối với hoặc bằng.
Giá trị trả về
Giá trị của *addr trước thao tác.

Thực hiện nguyên tử một hoặc hai giá trị, lưu trữ kết quả tại addr, tức là *addr |= value.

rsAtomicSub : Phép trừ an toàn cho luồng

int32_t rsAtomicSub(giá trị int32_t* volatile, giá trị int32_t); Đã thêm vào API cấp 14
int32_t rsAtomicSub(giá trị uint32_t* volatile, giá trị uint32_t); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueSố tiền bị trừ.
Giá trị trả về
Giá trị của *addr trước thao tác.

Trừ một giá trị nguyên tử khỏi giá trị tại addr, tức là *addr -= value.

rsAtomicXor : Bitwise an toàn cho luồng độc quyền hoặc

int32_t rsAtomicXor(giá trị int32_t* volatile, giá trị int32_t); Đã thêm vào API cấp 14
int32_t rsAtomicXor(uint32_t* addr, uint32_t giá trị); Đã thêm vào API cấp 20
Tham số
địa chỉ URLĐịa chỉ của giá trị cần sửa đổi.
valueGiá trị thành xor bằng.
Giá trị trả về
Giá trị của *addr trước thao tác.

Nguyên tử thực hiện xor bitwise của hai giá trị, lưu trữ kết quả tại addr, tức là *addr ^= value.