Perl的线程系统如何工作?

时间:2012-09-21 18:21:50

标签: multithreading perl multicore

Perl's documentation说: 自Perl 5.8以来,线程编程已经可以使用称为解释器线程的模型,它为每个线程提供了一个新的Perl解释器

在下面的程序中使用ps -Lm <pid>我可以看到线程并行运行,即它们在不同的核心中同时运行。但即使有4个线程(3个和主要)ps aux只显示一个Perl进程。

  1. 这是否意味着每个帖子上都有一个完整的 Perl解释器
  2. Perl线程是否已映射到系统线程
  3. 如果2为真,那么如何在一个流程中拥有多个Perl解释器呢?
  4. 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;
    

2 个答案:

答案 0 :(得分:13)

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

  1. 是的,每个帖子都有一个Perl解释器。

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

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


  4. * - 在构建Perl时需要使用-Dusemulitplicity,这是-Dusethreads隐含的,这是Perl中添加线程支持的方式。否则,使用一大堆全局变量而不是“类”。

答案 1 :(得分:8)

为了放大ikegami对第三个问题的回答,Perl为每个操作系统线程创建了一个完整的解释器整个状态。这意味着将复制所有数据和代码。在不利方面,这会使创建线程变慢并且Perl线程占用内存很多。

在更高的方面,线程彼此隔离,这使得编写线程安全代码变得更加容易。例如,大多数模块本质上是线程安全的,而作者不必做任何特殊的事情或根本不考虑线程。

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

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