トップ «前の日記(■2005-06-24) 最新 次の日記(■2005-07-01)» 編集

どんぞこ日誌

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|
2023|03|
2024|02|

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


■2005-06-27

* [状況] 引き続きB!

 うーん、まだ余裕が出来ないです。 えーと、バイトの件、一応、まだ募集中ということで。募集は終了しました。SOHO向け掲示板などではPHPだとすぐに人が集まるのになぁ……

* [Perl][メモ] threadsとunlinkB!

  「終了した thread であっても、reference counterなどに影響を与えているような感じがします」(thread は join() では死なない より)。具体的には、threadsを使ったときに子スレッドを明示的にundefしないとファイルをunlinkできないという話(ただしActivePerl 5.8.1以降)。要は、開いているファイルハンドルが子スレッドにコピーされたままなのでunlinkできないわけですね。

 # ActivePerl 5.8.1以降
 package IO::File;
 
 sub DESTROY {
   my $tid = threads->tid;
   print "destroyed($tid)\n";
 }
 
 package main;
 
 my $fname = './test.dat';
 my $fh    = IO::File->new(">$fname");
 { # ←このブロックをコメントアウトする
   my $th = threads->new(sub{ });
   # ↑$fhが子スレッドにコピーされる
   $th->join();
 } # ←このブロックをコメントアウトする
 
 $fh->close;
 print "now unlink\n";
 unlink($fname) or warn $!;
 
 # ブロックなし
 # now unlink
 # Permission denied at unlink.pl
 # destroyed(1)
 # destroyed(0)
 
 # ブロックあり
 # destroyed(1)
 # now unlink
 # destroyed(0)

元記事にあるようにundef $thするか、上記のように$thのスコープを限定させてGCを発動すれば子スレッド内(tid=1)のファイルハンドルも閉じられるのがわかります。
  ちなみに、joindetachをしないとスレッド内のデータはclean upされません。そのためjoinable状態の$thをundefしても、ファイルハンドルは閉じられないようです。

* [メモ] 備忘録B!

 上ので思い出しました。ディスクロージャとithreadsでPerlクラッシュ関連をithreadメモに追記しておくこと。

 奥崎謙三、亡くなられたんだ。 あー、「神様の愛い奴」を知人から借りっぱなしで、まだ観てないことを思い出した!

本日のツッコミ(全2件) [ツッコミを入れる]
_ asakura-t (■2005-06-27 18:25)

半年前なら応募してたのに(苦笑)>バイト<br>間が悪いなぁ。。。

_ まかまか (■2005-06-27 23:38)

うーん、残念です……

[]