概览
如需更新多个线程之间共享的值,请使用以下函数。它们可确保值以原子方式更新,即以正确的顺序执行内存读取、更新和内存写入。
这些函数比其非原子函数慢,因此请仅在需要同步时使用。
请注意,在 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
。