2

この perl プログラムの実行:

use strict;
use warnings;
use threads;

my $foo = Foo->new();

my $t = threads->create( sub { print "in thread\n" } );

$t->join();

package Foo;

sub new
{
print "Foo->new\n";
return bless {}, 'Foo';
}

sub DESTROY
{
print "Foo->DESTROY\n";
}

1;

次の出力が生成されます。

Foo->new
in thread
Foo->DESTROY
Foo->DESTROY

これは、perl が新しいスレッドで $foo のコピーを作成し、新しいスレッドが終了するときとメイン スレッドが終了するときにデストラクタを呼び出すために発生していると思います。これは私には悪い振る舞いのように思えます。私のはるかに複雑な実際のプログラムでは、頭痛の種です。perl がこれを行わないようにする方法はありますか?

4

2 に答える 2

4

これを Foo パッケージに入れたいと思うかもしれません:

sub CLONE_SKIP { 1 }

(古代の perl を使用していないと仮定します)。

しかし、新しいスレッドを作成するときに perl がすべてのコードとデータをコピーしていることに抵抗しようとすると、スレッドを使用しないほうがよい領域に入るということになります。その点について良いアドバイスを得るには、スレッドを何に使用しているかを言う必要があります。

于 2013-06-20T23:56:53.827 に答える