运行这个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不这样做?
答案 0 :(得分:4)
你可能想把它放在你的Foo包中:
sub CLONE_SKIP { 1 }
(假设你没有使用古老的perl)。
但是当你开始尝试打击perl正在复制你创建一个新线程时的所有代码和数据时,你正在进入你没有线程可能会更好的领域。你必须说明你使用线程来获得关于这一点的好建议。
答案 1 :(得分:0)
在启动线程之前不要构造对象。如果两个线程中确实需要该对象,请考虑共享它 - 仔细阅读threads::shared的文档。