RenderScript 原子更新函数

概览

如需更新多个线程之间共享的值,请使用以下函数。它们可确保值以原子方式更新,即以正确的顺序执行内存读取、更新和内存写入。

这些函数比其非原子函数慢,因此请仅在需要同步时使用。

请注意,在 RenderScript 中,即使您没有明确创建代码,代码也可能会在单独的线程中运行。RenderScript 运行时通常会将一个内核的执行拆分到多个线程中。更新全局变量应使用原子函数完成。如果可能,请修改算法,完全避免采用这些错误。

总结

函数
rsAtomicAdd 线程安全添加
rsAtomicAnd 线程安全按位和
rsAtomicCas 线程安全比较和设置
rsAtomicDec 线程安全递减
rsAtomicInc 线程安全增量
rsAtomicMax 线程安全最大值
rsAtomicMin 线程安全最小值
rsAtomicOr 线程安全按位或
rsAtomicSub 线程安全减法
rsAtomicXor 线程安全按位独占或

函数

rsAtomicAdd :线程安全加法

int32_t rsAtomicAdd(volatile int32_t* addr, int32_t value); API 级别 14 中引入
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); API 级别 20 中引入
参数
addr要修改的值的地址。
value充值金额。
返回
操作前 *addr 的值。

以原子方式向 addr 处的值添加一个值,即 *addr += value

rsAtomicAnd :线程安全按位和

int32_t rsAtomicAnd(volatile int32_t* addr, int32_t value); API 级别 14 中引入
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); API 级别 20 中引入
参数
addr要修改的值的地址。
value值与 的值。
返回
操作前 *addr 的值。

以原子方式执行一个按位值和两个值,并将结果存储回 addr 处,即 *addr &= value

rsAtomicCas :线程安全的比较和设置

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); API 级别 14 中引入
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); API 级别 14 中引入
参数
addr在测试通过时要比较和替换的值的地址。
比较值要测试 *addr 的值。
新值测试通过时要写入的值。
返回
操作前 *addr 的值。

如果 addr 处的值与 compareValue 匹配,则将 newValue 写入 addr,即 if (*addr == compareValue) { *addr = newValue; }

您可以通过检查 rsAtomicCas() 返回的值是否为 compareValue 来检查值是否已写入。

rsAtomicDec :线程安全递减

int32_t rsAtomicDec(volatile int32_t* addr); API 级别 14 中引入
int32_t rsAtomicDec(volatile uint32_t* addr); API 级别 20 中引入
参数
addr要递减的值的地址。
返回
操作前 *addr 的值。

自动从 addr 处的值减去 1。效果等同于 rsAtomicSub(addr, 1)

rsAtomicInc :线程安全增量

int32_t rsAtomicInc(volatile int32_t* addr); API 级别 14 中引入
int32_t rsAtomicInc(volatile uint32_t* addr); API 级别 20 中引入
参数
addr要递增的值的地址。
返回
操作前 *addr 的值。

以原子方式将 1 添加到 addr 中的值。效果等同于 rsAtomicAdd(addr, 1)

rsAtomicMax :线程安全最大值

int32_t rsAtomicMax(volatile int32_t* addr, int32_t value); API 级别 14 中引入
uint32_t rsAtomicMax(volatile uint32_t* addr, uint32_t value); API 级别 14 中引入
参数
addr要修改的值的地址。
value比较值。
返回
操作前 *addr 的值。

原子方式将 addr 处的值设置为 *addr 和值的最大值,即 *addr = max(*addr, value)

rsAtomicMin :线程安全最小值

int32_t rsAtomicMin(volatile int32_t* addr, int32_t value); API 级别 14 中引入
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t value); API 级别 14 中引入
参数
addr要修改的值的地址。
value比较值。
返回
操作前 *addr 的值。

原子方式将 addr 处的值设置为 *addr 和值的最小值,即 *addr = min(*addr, value)

rsAtomicOr :线程安全按位或

int32_t rsAtomicOr(volatile int32_t* addr, int32_t value); API 级别 14 中引入
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); API 级别 20 中引入
参数
addr要修改的值的地址。
value值与。
返回
操作前 *addr 的值。

以原子方式执行一个按位值或两个值,并将结果存储在 addr 处,即 *addr |= value

rsAtomicSub :线程安全减法

int32_t rsAtomicSub(volatile int32_t* addr, int32_t value); API 级别 14 中引入
int32_t rsAtomicSub(volatile uint32_t* addr, uint32_t value); API 级别 20 中引入
参数
addr要修改的值的地址。
value要扣除的金额。
返回
操作前 *addr 的值。

自动从 addr 处的值减去一个值,即 *addr -= value

rsAtomicXor :线程安全按位排除或

int32_t rsAtomicXor(volatile int32_t* addr, int32_t value); API 级别 14 中引入
int32_t rsAtomicXor(volatile uint32_t* addr, uint32_t value); API 级别 20 中引入
参数
addr要修改的值的地址。
value要执行异或运算的值。
返回
操作前 *addr 的值。

以原子方式对两个值执行按位异或运算,并将结果存储在 addr 处,即 *addr ^= value