volatile を Java の synchronized のように使ってみてはと言ってみる (by アレキサンドレスクさん)

なんかホントに凄いのでメモ。Modern C++ Designe な アンドレイ・アレキサンドレスク さんの提案です。

volatile は君の友達 - Backnumbers: Steps to Phantasien

「volatile 実はメンバ関数にもつけられる」+「const のように伝播する」→「これを スレッドセーフのサインに利用しよう」という話。volatileなメソッドの中で volatile でない関数を呼ぶとコンパイルエラーになるのを利用するのは賢い、けれど有りなの!? とも思います。

そもそもvolatile修飾子は最適化で変数が消えてしまうのが困る場合などに「消さないで」と付けるサイン。ハードウェアによって勝手に書き換えられる変数のようなものに付けて、コンパイラに「アンタは知らないかもしれないけど、これ使ってるやつ居るから」と教えてあげる、そんな合い言葉です。

そんな volatileが メンバ関数に付けられるのも初めて知ったし(というか何故??)、元々の「最適化しないでね」サインを豪快に無視している点も凄いしで、アレキサンドレスクの面目躍如といった感じ。そのほかにも const_cast でなぜか volatile にキャスト出来てしまうとか、知らないことがいっぱい。C++ の凄みを感じます。

Boost とか見ているとC++ の言語をハックするような使い方って凄く愉しそう。これに填ってしまうと戻れなくなってしまうのでしょうね。