目次 - API(機能別) - アトミック操作

# アトミック操作

インクルードファイル: SDL_atomic.h

## 概要

ここに分類される関数はアトミック操作(不可分操作)を扱う.

重要: もしあなたがロックしない並列プログラミングに精通していないのであれば, この分類で使うのはアトミックロックと参照カウントのみにして, それ以外は完全なmutexでデータ構造を守るべきだ. これは本当に危険である!

「安全な」関数は次の通り

- SDL_AtomicLock()
- SDL_AtomicUnlock()
- SDL_AtomicIncRef()
- SDL_AtomicDecRef()

ロックしないプログラミングとその問題についてはここで取り上げられている:

- http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx

参考になる情報はここにもある:

- http://www.1024cores.net/home/lock-free-algorithms
- http://preshing.com/

これらの操作は, プロセッサ固有のアトミック操作を実際に使って実装しているかもしれないし, そうでないかもしれない. もし可能であれば, 本当のプロセッサのアトミック操作で実装されている. 可能でなければ, アトミック操作可能なロックを使って実装されている.

メモリを操作するアトミック操作は全てメモリバリアである.

### アトミックロック

アトミックロックはCPU命令を使った効率的なスピンロックである. しかし, それは飢餓状態に弱く, スレッドがロックしたまま終了すると永遠にスピンしてしまう. そのため, アトミックロック内で実行するコードは最小限にして, APIやシステムコール等の負荷の大きな処理はロック中に行わないようにする必要がある.

注意: アトミックロックで再帰的にロックするのは安全ではない.

## 構造体

1. SDL_atomic_t

## 関数

1. SDL_AtomicAdd
2. SDL_AtomicCAS
3. SDL_AtomicCASPtr
4. SDL_AtomicDecRef
5. SDL_AtomicGet
6. SDL_AtomicGetPtr
7. SDL_AtomicIncRef
8. SDL_AtomicLock
9. SDL_AtomicSet
10. SDL_AtomicSetPtr
11. SDL_AtomicTryLock
12. SDL_AtomicUnlock
13. SDL_CompilerBarrier
14. SDL_MemoryBarrierAcquireFunction
15. SDL_MemoryBarrierReleaseFunction

## SDL Wikiへのリンク

Atomic Operations - SDL Wiki