8

Perl 的文档说: 从 Perl 5.8 开始,线程编程已经可以使用一种称为解释器线程的模型,它为每个线程提供一个新的 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;
4

2 回答 2

13

“Perl 解释器”是指 Perl 代码执行的环境。从用户的角度来看,这主要是符号表和其中的全局变量,但它也包括大量内部变量(例如,在解析期间使用的变量、当前操作等)。

  1. 是的,每个线程都有一个 Perl 解释器。

  2. 是的,Perl 线程是系统线程。

  3. 将“Perl 解释器”视为可以创建任意数量实例的类。* Perl 将其称为Multiplicity。请参阅perlembed了解如何在您的应用程序中嵌入 Perl 解释器。


* —-Dusemulitplicity在构建 Perl 时需要使用 ,这是由 暗示的-Dusethreads,这就是将线程支持添加到 Perl 的方式。否则,将使用一大堆全局变量而不是“类”。

于 2012-09-21T18:58:03.687 回答
8

为了扩大 ikegami 对您的第三个问题的回答,Perl 为每个操作系统线程创建了一个完整的解释器状态的完整副本。这意味着所有数据和代码都被复制。不利的一面是,这会导致创建线程变慢并且 Perl 线程需要大量内存。

从好的方面来说,线程彼此隔离,这使得编写线程安全代码变得更加容易。例如,大多数模块本质上都是线程安全的,而作者无需做任何特别的事情或完全考虑线程。

这是 Perl 的第二个线程实现。第一个是 5.005 个线程,是一种更传统的线程模型,其中线程共享代码和全局变量。它没有很好地工作。更糟糕的是,它使大多数 CPAN 模块变得无用,因为它们不协调的全局变量在各个线程之间相互冲突。

这怎么可能是池上提到并解释的一种叫做“多重性”的东西。这最初是出于在另一个 C 或 C++ 程序中嵌入 Perl 解释器的愿望。它需要改变 Perl 的工作方式,以便它隔离每个解释器对象的所有全局数据(全局变量和编译代码),而不是假设它是进程中运行的唯一 Perl 解释器。从那里开始,一个 Perl 解释器中的多个 Perl 解释器被用于fork在 Windows 上进行模拟。最后 5.6 线程建立在广泛的工作之上。

于 2012-09-21T20:52:20.400 回答