2013-06-20 27 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在新線程使$ foo的副本然後在新線程退出時以及主線程退出時調用析構函數。這對我來說似乎是不好的行爲。它讓我在更復雜的實際項目中頭痛不已。有沒有辦法讓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