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要比较和替换(如果测试通过)的值的地址。
compareValue用于与 *addr 进行测试的值。
newValue如果测试通过,要写入的值。
返回
操作之前 *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 处的值中减去一。这等同于 rsAtomicSub(addr, 1)

rsAtomicInc : 线程安全增量

int32_t rsAtomicInc(volatile int32_t* addr); 添加于 API 级别 14
int32_t rsAtomicInc(volatile uint32_t* addr); 添加于 API 级别 20
参数
addr要进行增量操作的值的地址。
返回
操作之前 *addr 的值。

原子地将 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 和 value 的最大值,即 *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 和 value 的最小值,即 *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