2007年10月31日 (水)たったひとつの冷めたやりかた
おはようございます。
本日の当番、プログラマのM.L.Kです(LはLoveのLです。Love&Peace!)。
と、いうわけで、Singletonパターンのお話でございます。
ヒワイな言葉を覚えた幼子が、嬉しがってそれを連呼するかのように、
「しんぐるとん」「しんぐるとん」
と、何かにつけては、呪文の如く得意げに唱えていたのは、何年か前の私。
その後、
「どうせ独身の豚ヤロウですが、何か?」
ってなカンジに、玩具に飽きたのは社会が悪いせいだ、と言わんばかりの中学2年生的ニヒルさでSingletonを軽んじて扱い始めた頃、事件は起こりました。
「マルチスレッドって、何よ?」
そうなのです。独身生活、もといシングルスレッドの環境に甘えていた私は、マルチスレッドなアプリケーションを作成中に、まったくスレッドセーフなデザインになっていないSingletonオブジェクトを使用して、当然の如く不具合に悩まされたのです。
そのときは、実装のあちこちにセマフォを適用し、何とか辻褄を合わせようとするも、幾つかの原因がよく分からない不具合が残ったため、Singletonパターンを用いるのは諦めることに。
単純なスレッド間同期の問題だけではなく、Singletonパターンは何らかの重大な問題を孕んでいるようでした。
結局、
「Singletonヤバイ」
と、心の奥の開けちゃいけない箱の中に、Singletonはしまわれちゃったワケです。
で、
電脳の海で波乗りを楽しんでいたある日、とんでもないものを目にしたのです。
『皆んな、
CFoo& CFoo::GetInstance(void)
{
static CFoo s_Instance;
return s_Instance;
}
が、スレッドセーフだと思ってるみたいだけど、アトミックでないコードにコンパイルされちゃうから、実は、スレッドセーフじゃなかったりするし』
「なんだってーーー!!!」
コンピュータはCネイティブで動いていると思っている今時の若者に、そんなデモクレイトスみたいなこと言われても…。
『Double Checked Lockingで実装しる。
CHoge* CHoge::GetInstance(void)
{
static CHoge* s_pInstance = NULL;
if(s_pInstance == NULL)
{
Lock(mutex)
if(s_pInstance == NULL)
{
s_pInstance = new Hoge();
}
Unlock(mutex);
}
return s_pInstance;
}
こういうの』
ビバ!頭のイイ人!神光臨!ヤホーイ!
「だぶるちぇっくどろっきんぐ」の音の響きをカッコイイと思いつつ、連呼するには語呂がイマイチと愚痴りながらも小躍りしていた矢先、次の記述を発見。
『Double Checked Lockingも、プラットフォームのアーキテクチャによっては、スレッドセーフでなくなる可能性もあるよ』
うわあぁぁぁ。
なんかもうね、あれですね、ニーチェですね。
結局、Singletonオブジェクトの生成・破棄は、スレッドが生成されていない初期化時とスレッドが破棄された終了間際に行うべき、というのが結論。
まあ、Singletonパターンは、実体を1つだけしか生成させないというのが本来の目的なので、確かにこれでいいと言えばいいのですが、あまりに冷静な大人対応です。
「うえ~ん!痩せたソクラテスよりも、太った豚のほうが良かったんだいっ」
と、思わず負け惜しみを言ってしまったM.L.Kなのでした。
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント