■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()でスレッドインタプリタが解放されるようになり、メモリリークが修正された
これらに基づきメモを修正しました。
[]

