戻るまで、スピンして待ちます。プリミティブを使います。メモリアドレス、期待する現在値、そして新しい値です。メモリ内の現在の値が期待する値と一致すれば、新しい値に置き換えられ、古い値が返されます。現在の値が期待する値と一致しなければ、変更は行われません。呼ばれるものもあります。こちらは、古い値を返す代わりに、置換が成功したかどうかを表すブーリアンを返します。例がいくらかシンプルになるので、そちらを使うことにします。(Cっぽい言語を使っていると思ってください)。(ロックを保持したことを表します)。その場合、繰り返しリトライします。関数の外側にあることに注意してください。コードのループが行われているはずです。スピンロックは小さなクリティカルセクションを保護する便利な手段です。サイクルを消費するのは、大したことではありません。まで、そのスレッドが動くことは出来ず、時間を無駄にするだけです。他のスレッドが処理を終えるまで待つ間、現在のスレッドをスリープさせるようになっています。シングルプロセッサにおいては、スピンする価値はまったくありません。話を簡単にするために、こういったことは一切無視しています。メモリバリアは必要です。ロックの取得が見えることを保証しなければなりません。ロックを保持していない間も見える可能性があります。独立した操作を行います。フルメモリバリア命令を発行します。ふたつめは、バリアの周りのコードを並び替えてはいけないことをコンパイラに指示します。クリティカルセクション内のいかなるコードよりも前に実行されます。ソースコード上の順序とまったく違ったものになるでしょう。ロック解放後に見えることがないようにもしなければなりません。シンプルなスピンロックの完全なバージョンは以下のようになります。つめのメモリバリアを実行しています。おいては単なる代入です。他のスレッドからこの値を直ちに見えるようにする保証を行っていません。これは問題にはなりません。必要なのは、他のスレッドが中に入れないようにすることだけです。書き込みが見えるまで、中に入ることができません。コードは正しく実行されます。アトミック操作とバリアの呼び出しは、ひとつの関数にまとめると便利です。便利以外にも、コードが分かりやすくなるという利点があります。実行し、その後にバリアを張ります。スピンロックを解放するときは、バリアを張り、その後にアトミック書き込みを実行します。これに着想を得た、ある命名の慣習があります。事前にバリアを張る操作を「解放」操作と呼びます。(スピンロックの例は、しっかりと頭の中に入れておいた方がいいでしょう。なければ、このネーミングは意味不明です。)これを考慮に入れて、スピンロックの例を書き直します。0)多少簡潔になり、読みやすくなりました。いくつかの最適化が出来るようになる、というところにあります。ついて考えてみましょう。保証しなければなりません。読み込み/書き込みバリアと書き込み/書き込みバリアが必要だということです。これらが必要ないことを学びました。書き込み/読み込みバリアだけが要求されます。コンパイラ並び替えバリアの後に、単なる書き込みを行うだけのものです。バリアは必要ありません。同様にこの利点を得られるものがあります)。