概要
複数のスレッド間で共有される値を更新するには、以下の関数を使用します。 これにより、値がアトミックに更新されます。つまり、メモリの読み取り、更新、メモリ書き込みが正しい順序で実行されます。
これらの関数はアトミックでない同等の関数よりも低速であるため、同期が必要な場合にのみ使用してください。
RenderScript では、明示的に作成していなくても、コードが別のスレッドで実行される可能性があります。RenderScript ランタイムは、多くの場合、1 つのカーネルの実行を複数のスレッドに分割します。グローバルの更新はアトミック関数を使用して行う必要があります。可能であれば、完全に回避するようにアルゴリズムを変更します。
まとめ
関数 | |
---|---|
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 の値。 |
2 つの値のビット単位の計算をアトミックに実行し、結果を 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 の値が 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 の値。 |
addr の値にアトミックに 1 を加算します。これは 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 の値。 |
ビット単位または 2 つの値をアトミックに実行し、その結果を 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 | xor で結合する値です。 |
戻り値
操作前の *addr の値。 |
2 つの値のビット単位の XOR をアトミックに実行し、その結果を addr に格納します(例: *addr ^= value
)。