2013-06-20 3 views
2

Запуск этой программы PERL: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 делает копию $ обув в новом потоке а затем вызов деструктора при выходе нового потока и выходе основного потока. Мне это кажется плохим поведением. Это дает мне головные боли в моей гораздо более сложной, актуальной программе. Есть ли способ заставить Perl не делать этого?

+0

Похоже, что это по дизайну: http://www.gossamer-threads.com/lists/perl/porters/269726?do=post_view_threaded#269726 – Pragmateek

+0

Зачем вам нужно использовать потоки? – ysth

ответ

4

Вы можете поместить это в пакет Foo:

sub CLONE_SKIP { 1 } 

(если вы не используете древний Perl).

Но когда вы начинаете пытаться бороться с тем, что perl копирует весь ваш код и данные во время создания нового потока, вы входите на территорию, где вам может быть лучше без потоков. Вам нужно будет сказать, что вы используете потоки, чтобы получить хороший совет по этому вопросу.

+0

Удивительный! Ваш ответ - это то, что мне нужно. Я бы проголосовал за это, если бы у меня было достаточно очков. – azbithead

+0

вы можете принять его, даже если вы не можете его продвинуть? – ysth

0

Не строите объект перед запуском нити. Если объект действительно необходим в обоих потоках, подумайте об обмене его - внимательно прочитайте документацию threads::shared.

+0

В моей реальной программе $ foo вообще не нужен дочернему потоку, но он должен быть создан и использован до и после создания дочернего потока. – azbithead

Смежные вопросы