トップ «前の日記(■2006-01-31) 最新 次の日記(■2006-02-08)» 編集

どんぞこ日誌

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|
2018|03|
2022|03|

同人関連(どんぞこ楽屋) | 旧い雑文   


■2006-02-05

* [Perl][メモ] threads関連:blessのサポートB!

  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()でスレッドインタプリタが解放されるようになり、メモリリークが修正された

  これらに基づきメモを修正しました。

[]