■2006-02-05
* [Perl][メモ] threads関連:blessのサポート
threads::sharedはPerlの標準モジュールですが、CPANに最新の0.95があがっていてblessがサポートされたとあります。threadsのドキュメントには共有リファレンスをblessしても他のスレッドにはblessされたことが伝わらないとなっています。ところで実際に試してみると、Perl 5.8.0(threads::shared 0.90)では確かに全く対応していませんが、5.8.1以降は共有化されたハッシュリファレンスとスカラーリファレンスに関してはblessが伝搬されていました。ただしスカラーリファレンスはダメ。5.8.1以降のshared.xsファイルのソースをみるとblessが定義されていて、threads::sharedをuseするときにEXPORTされていたんですね。最新のthreads::shared 0.95でスカラーリファレンスもblessが伝搬されました。
use threads; use threads::shared; my $obj : shared; $obj = &share([]); threads->new(\&bless_test, $obj)->join; print ref($obj) , "\n"; $obj = &share({}); threads->new(\&bless_test, $obj)->join; print ref($obj), "\n"; $obj = &share(\1); threads->new(\&bless_test, $obj)->join; print ref($obj), "\n"; sub bless_test { my $obj_in_thr : shared = shift; bless $obj_in_thr, 'Foo'; }
それからPerl5.8.8でのithread関連:
・no warnings 'threads'が効くようになった
・$t->join()でスレッドインタプリタが解放されるようになり、メモリリークが修正された
これらに基づきメモを修正しました。