スレッドと所有権

スレッド、というかスレッドのスタックや TLS っていうのは、通常所有することのできない、レアなオモシロリソースなんですよね。物理デバイスに紐づいたリソースとかもそうですけど。

http://twitter.com/#!/Cryolite/status/41392398366015488

作成したスレッドが HWND を所有すれば良いんじゃね? 他のスレッドにおいては HWND を作成したスレッドを所有してかつ HWND に alias した shared_ptr を使うとか? 知らんけど?

ということなんですが、まあ作成したスレッドが HWND を所有すればいいっていうのは、ボクもそういってたはずなのでいいとして、後者はダメなわけです。スレッドの所有とかできなくて、スレッドは勝手に死ぬ。スレッドが死ねばスタックや TLS も死ぬ。
じゃあどうしても死んでて欲しくない場合には?「あなた、私がいいというまで、死んではだめよ」(オー、オソロシイ…)ということで condition variable とか使うことになる。でもそれって結局 lifetime の操作というか保障というかは、コードでしてるわけで、どうにもなってないというか…ヌーン、という。condition variable 使う場合には、デリーターに notify させると、まあ少しは楽でいいですね。

なんですが、プレゼンの発表的には「有効じゃなくてもいいよ」という条件があったので、ああいう形になりました。

とはいえ HWND の例は、そもそも shared_ptr で管理する必要は、正直そんなに思います。値で所有権を扱えない、扱いにくいパターンとか普通にあるし、そういう時に shared_ptr 使って難しいデリータとか書いて対処するなら、普通に書けばいいと思います。更に言えばそんなこと滅多にないので、忘れていいです。もしくは managed で let's GC!