この記事はLinux Advent Calendar 2014の13日目です。 LWNのACCESS_ONCE() and compiler bugsを読んでなるほどねーと思ったのでその辺について書いてみたいと思います。 最適化の技と言いつつ実際は最適化させすぎない技なんですが\(^o^)/ まずACCESS_ONCEマクロの役割ですが、これは必ずデータを読みたいという場合に使ってます。 例えばこんなコードがあったときに(かなり適当ですが雰囲気は掴めるはず) while (1) { struct foobar *p = foo; if (p->hoge) { .... } } コンパイラはこのように最適化をかけてくる可能性があるんだけど、fooは別のスレッドによって変更されるのでループ毎にデータをfetchして欲してというケースで使うのがACCESS_ONCEマクロみたいです。 struc