C++0xのブロックスコープstatic変数が素晴らしい件

yamasaのネタ帳の「C++0x時代の Double-Checked Locking」を読んだ。

Double-Checked Locking(DCL)を正しく実装するには、atomicな操作とメモリバリアが必要であるという話。
C++0xでそれが可能になったのだそうだ。

メモリバリア付きでatomicな操作はWindowsのInterlocked〜などでもできたわけだけど、言語レベルでサポートされるようになったということか。

「release/acquireメモリバリアによるDCL」のコードはかなりビビる。だって、メモリバリアを指定してloadとかstoreとかやってるんだもん。アセンブラみたいだ。そしてこれが、新しい標準ライブラリの機能ということらしい。

もう、いいです。DCLしません。ガッツリmutex使います、ごめんなさい。と一瞬思ったが、この記事の最後に救われた。

なんでも、ブロックスコープのstatic変数を使うだけで問題が解決するそうだ。
きっとコンパイラがDCLしてくれるのだろう。
もうDCLなんてセコいことをしなくてもいいんだ。
我々はコンパイラを取り換えるだけでいい。

こうして、マルチスレッドプログラミングは私のようなヘタレにも扱えるようになっていく。
素晴らしいことである。