目次 - API(機能別) - アトミック操作
アトミック操作
インクルードファイル: SDL_atomic.h
概要
ここに分類される関数はアトミック操作(不可分操作)を扱う.
重要:
もしあなたがロックしない並列プログラミングに精通していないのであれば, この分類で使うのはアトミックロックと参照カウントのみにして,
それ以外は完全なmutexでデータ構造を守るべきだ.
これは本当に危険である!
「安全な」関数は次の通り
ロックしないプログラミングとその問題についてはここで取り上げられている:
参考になる情報はここにもある:
これらの操作は, プロセッサ固有のアトミック操作を実際に使って実装しているかもしれないし, そうでないかもしれない.
もし可能であれば, 本当のプロセッサのアトミック操作で実装されている.
可能でなければ, アトミック操作可能なロックを使って実装されている.
メモリを操作するアトミック操作は全てメモリバリアである.
アトミックロック
アトミックロックはCPU命令を使った効率的なスピンロックである. しかし, それは飢餓状態に弱く, スレッドがロックしたまま終了すると永遠にスピンしてしまう.
そのため, アトミックロック内で実行するコードは最小限にして, APIやシステムコール等の負荷の大きな処理はロック中に行わないようにする必要がある.
注意: アトミックロックで再帰的にロックするのは安全ではない.
関数
- SDL_AtomicAdd - アトミック変数に加算する
- SDL_AtomicCAS - もしアトミック変数が「古い値」ならば「新しい値」にする
- SDL_AtomicCASPtr - もしポインタが「古い値」ならば「新しい値」にする
- SDL_AtomicDecRef - 参照カウントとしてのアトミック変数を1減らす
- SDL_AtomicGet - アトミック変数の値を得る
- SDL_AtomicGetPtr - アトミックにポインタを得る
- SDL_AtomicIncRef - 参照カウントとしてのアトミック変数を1増やす
- SDL_AtomicLock - 0でない値を設定することでスピンロックする
- SDL_AtomicSet - アトミック変数に値を設定する
- SDL_AtomicSetPtr - アトミックにポインタを設定する
- SDL_AtomicTryLock - 0でない値を設定することでスピンロックを試みる
- SDL_AtomicUnlock - 0を設定することでスピンロックを解除する
- SDL_CompilerBarrier - コンパイラが呼び出しにまたがるグローバル変数の読込と書込の順序を入れ替えるのを防ぐ
- SDL_MemoryBarrierReleaseFunction - メモリバリアは, マルチコアCPUでコンパイラによって読み込みと書き込みの順序が変えられ, 順不同に見えるのを防ぐために存在する
構造体
- SDL_atomic_t - アトミック整数値を表す構造体
SDL Wikiへのリンク
Atomic Operations - SDL Wiki