スピンロック
Spin lock
マルチCPU(マルチスレッド)の場合、ロック待ちでタスクディスパッチするよりは、ロックフラグをポーリングした方が早いことがある。 この方式によるロックをスピンロックと呼ぶ。
マルチCPU(マルチスレッド)であること。
片方がポーリングしている時に、もう片方がロック解除まで進むこと。これが満たされないとデッドロックになる。
シングルCPUでも、割り込み方式のタスクディスパッチができていれば一応動くはず。ただしとても遅くなる。
シングルCPUにすると極端に遅くなるケースはたぶんこれ。
ロックした側はロック中にタスクディスパッチしないこと。
タスクディスパッチしてしまうと、再び元のタスクにタスクディスパッチするまでポーリングが続いてしまう。
衝突頻度が少なければ問題ないはず
スピンロックを実現するCPU命令
TAS (Test And Set)
フラグが立っていればロック失敗
フラグが立っていなければ立ててロック成功
アンロックはフラグを下げる。
CAS (Compare And Swap)
以前読み出した値と比較して、異なる値だったら失敗。もう一度その値を読む。
同じ値のままなら新しい値に入れ替えてロック成功。(場合によっては古い値が得られる。)
POSIX の pthread ライブラリによる実装