Perl's documentation说: 自Perl 5.8以来,线程编程已经可以使用称为解释器线程的模型,它为每个线程提供了一个新的Perl解释器
在下面的程序中使用ps -Lm <pid>
我可以看到线程并行运行,即它们在不同的核心中同时运行。但即使有4个线程(3个和主要)ps aux
只显示一个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 :(得分:13)
“Perl解释器”指的是Perl代码执行的环境。从用户的角度来看,这主要是符号表和其中的全局变量,但它还包括一系列内部变量(例如在解析期间使用的变量,当前的op等)。
是的,每个帖子都有一个Perl解释器。
是的,Perl线程是系统线程。
将“Perl解释器”视为可以创建任意数量实例的类。* Perl将其称为Multiplicity。有关如何在应用程序中嵌入Perl解释器的信息,请参阅perlembed。
* - 在构建Perl时需要使用-Dusemulitplicity
,这是-Dusethreads
隐含的,这是Perl中添加线程支持的方式。否则,使用一大堆全局变量而不是“类”。
答案 1 :(得分:8)
为了放大ikegami对第三个问题的回答,Perl为每个操作系统线程创建了一个完整的解释器整个状态。这意味着将复制所有数据和代码。在不利方面,这会使创建线程变慢并且Perl线程占用内存很多。
在更高的方面,线程彼此隔离,这使得编写线程安全代码变得更加容易。例如,大多数模块本质上是线程安全的,而作者不必做任何特殊的事情或根本不考虑线程。
这是Perl的第二个线程实现。第一个5.005线程是一个更传统的线程模型,其中线程共享代码和全局变量。它效果不佳。更糟糕的是,它使大多数CPAN模块无用,因为它们的不协调的全局变量在各种线程中相互冲突。
如何可能的是一种被称为“多重性”的东西,池上提到并解释过。这最初源于在另一个C或C ++程序中嵌入Perl解释器的愿望。它需要改变Perl的工作方式,因此它可以隔离每个解释器对象的所有全局数据(全局变量和编译代码),而不是假设它是唯一在该进程中运行的Perl解释器。从那里开始,Perl解释器中的多个Perl解释器用于在Windows上模拟fork
。最后,在广泛的工作之上构建了5.6个线程。