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 回答
0

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

于 2013-06-20T23:48:35.400 回答