Perl线程与对象析构函数

时间:2013-06-20 23:30:22

标签: multithreading perl oop

运行这个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不这样做?

2 个答案:

答案 0 :(得分:4)

你可能想把它放在你的Foo包中:

sub CLONE_SKIP { 1 }

(假设你没有使用古老的perl)。

但是当你开始尝试打击perl正在复制你创建一个新线程时的所有代码和数据时,你正在进入你没有线程可能会更好的领域。你必须说明你使用线程来获得关于这一点的好建议。

答案 1 :(得分:0)

在启动线程之前不要构造对象。如果两个线程中确实需要该对象,请考虑共享它 - 仔细阅读threads::shared的文档。