テスト・アンド・セット
テスト・アンド・セット命令でスピンロックを実装する場合、テスト・アンド・セット命令によるアトミックなメモリアクセスによってバスがロックされ、キャッシュがインバリッドとなるため、性能に悪影響を与える。
このオーバヘッドを下げるため、「テスト・アンド・テストアンドセット」と呼ばれるロックプロトコルが使われる。アイデアの基本はテスト・アンド・セット命令をスピンの期間中に使わないで、成功すると予想されるときにのみテスト・アンド・セット命令を使うのである。以下に擬似コードでの例をあげる:
解放処理は以下の通り:
クリティカルセクションに入る処理では、通常のメモリリードでスピンし、ロックが解放されるのを待つ。テスト・アンド・セットは実際にロックを獲得するときだけ使用する。従って、テスト・アンド・セットの回数が減り、バスをロックする回数も減る。
もし、プログラミング言語が最小評価方式(Minimal Evaluation)ならば、ロック獲得処理を以下のように実装することもできる:
なお、この最適化が有益なのはシステムプログラムの分野のみである。アプリケーションレベルの並列処理ではこのような方式を採用すべきでない。このようなプログラムは「ダブルチェックされたロック」と呼ばれ、アンチパターンのひとつに挙げられている。