とってもいい本です。
本の内容
自分に刺さった部分を中心に再構成すると、基礎パート、理論パート、実践パートの3つがよかった。
基礎パートではその後全編にわたって核となるアトミック操作について丁寧に説明している。
理論パートでは、メモリオーダリングについてある程度形式的に説明されていてこれがとてもよかった。メモリオーダリングとはアトミックに操作の時に指定するRelaxedとか、Acquireとか、Releaseとかのことで、正しい並行プログラムを書くためには理解が欠かせないところだ。本書では「先行発生関係」という用語を用いてこれらのオーダリングが何を保証してくれるのかを形式的に定義する。さらに詳しくやりたい場合はメモリモデルの本をあたるとよさそう。
実践パートでは、今まで説明した道具を使っていろいろな並行プリミティブを再発明する。スピンロック、チャネル、Arcでは、素朴な実装から初めて段々と最適化を進めていくインクリメンタルな構成になっていて、改善のモチベーションがわかりやすかった。さらにMutex、条件変数、リーダ・ライタ・ロックといったもっとプリミティブな実装の再発明も行っていた。魔法のからくりを垣間見れてよかった。
Rustとの関わり
本書はRustで書かれているのだが、レイヤーが低いのでunsafeまみれのコードになる。これがよかった。unsafeは、Rustの安全性を保証するために型システムがやってることを代わりにプログラマが保証して使わないといけない。これを正しく使うためには、Rustの型システムが何を保証しているのかを理解していないといけないので、unsafeを使って安全なインターフェースを作ることでRust自体とプリミティブなところの機微が少し理解できた気がする。これは例えばMutex、MutexGuardといったデザインのモチベーションとか、UnsafeCellといった内部可変性を持つデータのモチベーションとかである。
他の本との関連性
『並行プログラミング入門』とは非常に関連が深い。自分は最初にこちらを読んでしまったが、今回の『詳解Rustアトミック操作とロック』を最初に読んだ方がいいと思う。メモリオーダリングの説明をちゃんと理解したり、よりシンプルな道具の再発明をやってからの方がおそらくいい。『プログラマのためのCPU入門』は部分的に関連がある。どちらを先に読んだ方がいいとかはあまりない気がする。どちらもいい本なので好きなタイミングで読むと言い。