修羅場前
最後に書いたメモ
が
Perlのithreadsについて
に紹介されていました。
原因として考えられるものは
たぶんサブルーチンtestの@_に外部から参照されていないリファレンスが残っていると、
子スレッドにこれがコピーされて、threadsオブジェクトが破壊される際(サブルーチン
の終わり部分)のガベージコレクトで悪さをしているのではないかと思います。
ということだそうです。
対処方法としては、関数を呼び出す際に呼び元で reference を作っておく他に
単にサブルーチンの最初でshiftやpopを使って@_から怪しげなものを取り除いてしまう
という方法があるようです。
僕が書くコードでは、引数のやり取りに shift() を使わずに
my ($arg1, $arg2, $arg3,...) = @_;
という書き方をしているために @_ に「怪しげなもの」が残ってしまって、
leak が発生してしまっているようです。
手元では threads を使う機会が少ないのとこの記法を改める気がまったくないので、
「呼び元で reference を作っておく」方法で回避するつもりです。