2012-09-21 61 views
6

Perl's documentation說: 因爲Perl 5.8線程編程已經可以使用模型稱爲解釋線程提供了一個新的Perl解釋器爲每個線程Perl的線程系統是如何工作的?

使用ps -Lm <pid>與下面的程序,我可以看到線程並行運行,即它們在不同的內核中同時運行。但即使有4個線程(3和主)ps aux只顯示一個Perl進程。

  1. 這是否意味着有每個線程在整個Perl解釋器
  2. 是否Perl的線程映射到系統線程
  3. 如果2爲真,在一個進程中如何可能有多個Perl解釋器?
use threads; 

$thr = threads->new(\&sub1); 
$thr2 = threads->new(\&sub1); 
$thr3 = threads->new(\&sub1); 

sub sub1 { 
     $i = 0; 
     while(true){ 
     $i = int(rand(10)) + $i; 
     } 
} 


$thr->join; 
+0

http://stackoverflow.com/questions/9973860/use-cases-for-ithreads-interpreter-threads-in-perl-and-rationale-for-using-or – user454322

+2

我強烈建議閱讀[這]( http://www.perlmonks.org/index.pl?node_id=288022)在任何項目中使用「Perl線程」之前。 – PSIAlt

+0

此外,在perl 5.20發行說明中:現在勸阻基於解釋程序的線程 「interpreter- Perl提供的「基於線程的線程」並不是快速,輕量級的多任務處理系統,人們可能會期望或期望。線程的實現方式很容易被濫用。很少有人知道如何正確使用它們或者能夠提供幫助。 – Rob11311

回答

10

「Perl解釋」 是指其中Perl代碼執行環境。從用戶的角度來看,這主要是符號表和其中的全局變量,但它也包括一系列內部變量(例如在解析過程中使用的變量,當前操作等)。

  1. 是的,每個線程都有一個Perl解釋器。

  2. 是的,Perl線程是系統線程。

  3. 將「Perl解釋器」想象成可以創建任意數量實例的類。* Perl將其稱爲Multiplicity。有關如何在應用程序中嵌入Perl解釋器的信息,請參閱perlembed


* —建設Perl,它是由-Dusethreads暗示,這是線程支持是如何加入到Perl的時候需要使用-Dusemulitplicity。否則,使用一大堆全局變量來代替「類」。

6

爲了放大ikegami對第三個問題的回答,Perl會爲每個操作系統線程創建一個完整的解釋器狀態副本。這意味着所有的數據和代碼都被複制。不利的一面是,這使得創建線程變慢,並且Perl線程很飢餓。

另一方面,線程彼此隔離,這使得線程安全代碼更容易編寫。例如,大多數模塊本質上是線程安全的,而作者不必做任何特殊的事情或者根本就不考慮線程。

這是Perl的第二個線程實現。第一個5.005線程是線程共享代碼和全局變量的更傳統的線程模型。它沒有很好地工作。更糟的是,它使大多數CPAN模塊無用,因爲它們的不協調的全局變量在各個線程中相互衝突。

ikegami提到並解釋了一種叫做「多重性」的東西。這最初是出於在另一個C或C++程序中嵌入Perl解釋器的願望。它需要改變Perl的工作方式,以便將每個解釋器對象的所有全局數據(全局變量和已編譯的代碼)隔離開來,而不是假定它只有在進程中運行的Perl解釋器。從那裏開始,Perl解釋器中有多個Perl解釋器,用於在Windows上模擬fork。最後5.6線程建立在廣泛的工作之上。