總覽
如要更新多個執行緒之間共用的值,請使用以下函式。 他們會確保值全面更新,也就是讓系統以正確的順序執行記憶體讀取、更新和記憶體寫入作業。
這些函式的速度比非不可分割的對等項目慢,因此請只在需要同步時使用。
請注意,在 RenderScript 中,即使您並未明確建立程式碼,您的程式碼仍可能在不同執行緒中執行。RenderScript 執行階段通常會將一個核心的執行作業分割至多個執行緒。更新全域變數時應透過原子函式完成。可以的話,請修改演算法,避免完全採用。
摘要
函式 | |
---|---|
rsAtomicAdd | 執行緒安全新增功能 |
rsAtomicAnd | 執行緒安全位元和 |
rsAtomicCas | 比較及設定執行緒安全 |
rsAtomicDec | 執行緒安全減少功能 |
rsAtomicInc | 執行緒安全遞增 |
rsAtomicMax | 執行緒安全上限 |
rsAtomicMin | 執行緒安全下限 |
rsAtomicOr | 執行緒安全位元或 |
rsAtomicSub | 確保執行緒安全 |
rsAtomicXor | 僅限執行緒安全位元,或 |
函式
rsAtomicAdd :確保執行緒安全新增功能
int32_t rsAtomicAdd(volatile int32_t* 新增器、int32_t 值); | 已在 API 級別 14 中新增。 |
int32_t rsAtomicAdd(volatile uint32_t* 加器, uint32_t 值); | 已在 API 級別 20 中新增。 |
參數
加法器 | 要修改的值的地址。 |
---|---|
value | 儲值金額。 |
傳回
作業前 *addr 的值。 |
「Atomicly」會在加法器將值加到值中,例如 *addr += value
。
rsAtomicAnd :執行緒安全位元和
int32_t rsAtomicAnd(volatile int32_t* 新增器、int32_t 值); | 已在 API 級別 14 中新增。 |
int32_t rsAtomicAnd(volatile uint32_t* 新增器, uint32_t 值); | 已在 API 級別 20 中新增。 |
參數
加法器 | 要修改的值的地址。 |
---|---|
value | 價值與目標的價值。 |
傳回
作業前 *addr 的值。 |
Atomicly 會執行位元和兩個值,將結果儲存在加法點 (例如 *addr &= value
)。
rsAtomicCas :執行緒安全比較與設定
int32_t rsAtomicCas(volatile int32_t* 新增器、int32_tCompareValue、int32_t newValue); | 已在 API 級別 14 中新增。 |
uint32_t rsAtomicCas(volatile uint32_t* addr、uint32_tcompareValue、uint32_t newValue); | 已在 API 級別 14 中新增。 |
參數
加法器 | 要在測試通過時比較及替換的值位址。 |
---|---|
比較值 | 要測試 *加法的值。 |
新值 | 通過測試時要寫入的值。 |
傳回
作業前 *addr 的值。 |
如果 addr 中的值與 analyzeValue 相符,則系統會在 addr 上寫入新的值 (例如 if (*addr == compareValue) { *addr = newValue; }
)。
您可以檢查 rsAtomicCas() 傳回的值是否是 CompareValue,藉此檢查值是否已寫入。
rsAtomicDec :執行緒安全減少
int32_t rsAtomicDec(volatile int32_t* 新增工具); | 已在 API 級別 14 中新增。 |
int32_t rsAtomicDec(volatile uint32_t* 新增器); | 已在 API 級別 20 中新增。 |
參數
加法器 | 要減少的值的地址。 |
---|
傳回
作業前 *addr 的值。 |
以個別方式從加法值中減去 1。這相當於 rsAtomicSub(addr, 1)
。
rsAtomicInc :執行緒安全遞增
int32_t rsAtomicInc(volatile int32_t* 新增器); | 已在 API 級別 14 中新增。 |
int32_t rsAtomicInc(volatile uint32_t* addr); | 已在 API 級別 20 中新增。 |
參數
加法器 | 要增加的值的地址。 |
---|
傳回
作業前 *addr 的值。 |
在 Addr 上將 1 加至值。這相當於 rsAtomicAdd(addr, 1)
。
rsAtomicMax :執行緒安全上限
int32_t rsAtomicMax(volatile int32_t* 新增器、int32_t 值); | 已在 API 級別 14 中新增。 |
uint32_t rsAtomicMax(volatile uint32_t* 加器, uint32_t 值); | 已在 API 級別 14 中新增。 |
參數
加法器 | 要修改的值的地址。 |
---|---|
value | 比較值。 |
傳回
作業前 *addr 的值。 |
「Atom」將「Addr」的值設為「addr」和「value」的最大值,即 *addr = max(*addr, value)
。
rsAtomicMin :執行緒安全下限
int32_t rsAtomicMin(volatile int32_t* 加器、int32_t 值); | 已在 API 級別 14 中新增。 |
uint32_t rsAtomicMin(volatile uint32_t* 加法器、uint32_t 值); | 已在 API 級別 14 中新增。 |
參數
加法器 | 要修改的值的地址。 |
---|---|
value | 比較值。 |
傳回
作業前 *addr 的值。 |
原型將值設為 addr 的最小值,也就是 *addr 和值,例如 *addr = min(*addr, value)
。
rsAtomicOr :執行緒安全位元或
int32_t rsAtomicOr(volatile int32_t* 新增器、int32_t 值); | 已在 API 級別 14 中新增。 |
int32_t rsAtomicOr(volatile uint32_t* 新增器、uint32_t 值); | 已在 API 級別 20 中新增。 |
參數
加法器 | 要修改的值的地址。 |
---|---|
value | 指定或等於的值。 |
傳回
作業前 *addr 的值。 |
不可分割地執行位元或兩個值,將結果儲存在 Addr 中,例如 *addr |= value
。
rsAtomicSub :執行緒安全減法
int32_t rsAtomicSub(volatile int32_t* 新增器、int32_t 值); | 已在 API 級別 14 中新增。 |
int32_t rsAtomicSub(volatile uint32_t* 新增器、uint32_t 值); | 已在 API 級別 20 中新增。 |
參數
加法器 | 要修改的值的地址。 |
---|---|
value | 要減去的金額。 |
傳回
作業前 *addr 的值。 |
以原型方式從相加的值中減去值,即 *addr -= value
。