Perl线程入门指南

开发 架构
Perl线程的概念你是否熟悉,Perl线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被CPU所调度的最小任务单元。

本文首先概述了Perl线程的概念和意义,接着回顾了Perl语言中对Perl线程支持的演化历史,然后通过一系列示例重点介绍了Perl中Perl线程的实现,数据的共享以及Perl线程间的同步,最后归纳并总结了全文主要内容。

Perl线程概述

Perl线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被CPU所调度的最小任务单元。Perl线程与进程之间既有联系,又完全不同。简单地说,一个Perl线程必然属于某一个进程,而一个进程包含至少一个或者多个Perl线程。早期的计算机系统一次只能运行一个程序,因此,当有多个程序需要执行的时候,唯一的办法就是让它们排成队,按顺序串行执行。进程的出现打破了这种格局,CPU资源按时间片被分割开来,分配给不同的进程使用。这样一来,从微观上看进程的执行虽然仍是串行的,但是从宏观上看,不同的程序已经是在并行执行了。如果我们把同样的思想运用到进程上,很自然地就会把进程再细分成更小的执行单位,即Perl线程。由于一个进程又往往需要同时执行多个类似的任务,因此这些被细分的Perl线程之间可以共享相同的代码段,数据段和文件句柄等资源。有了进程,我们可以在一台单CPU计算机系统上同时运行Firefox和MicrosoftOfficeWord等多个程序;有了Perl线程,我们可以使Firefox在不同的标签里同时加载多个不同的页面,在OfficeWord里编辑文档的同时进行语法错误检查。因此,Perl线程给我们带来了更高的CPU利用率、更快速的程序响应、更经济地资源使用方式和对多CPU的体系结构更良好的适应性。

Perl线程的历史

5005threadsPerl线程模型

Perl对Perl线程的支持最早可以追溯到1998年7月发布的Perlv5.005。其发布申明指出,Perlv5.005中加入了对操作系统级Perl线程的支持,这个新特性是一个实验性的产品,这也就是我们现在所称的5005threadsPerl线程模型。对于5005threadsPerl线程模型来说,默认情况下,所有数据结构都是共享的,所以用户必须负责这些共享数据结构的同步访问。如今5005threads已经不再被推荐实用,Perlv5.10以后的版本里,也将不会再支持5005threadsPerl线程模型。

ithreadsPerl线程模型

2000年5月发布的Perlv5.6.0中开始引入了一个全新的Perl线程模型,即interpreterthreads,或称为ithreads,也正是在这个版本的发布申明中第一次提出了5005threadsPerl线程模型将来可能会被禁用的问题。尽管如此,ithreads在那个时候还是一个新的实验性的Perl线程模型,用户并不能直接使用它,唯一的办法是通过fork函数模拟。经过两年时间的发展,到2002年7月,Perlv5.8.0正式发布,这时ithreads已经是一个相对成熟的Perl线程模型,发布申明中也鼓励用户从老的5005threadsPerl线程模型转换到新的ithreadsPerl线程模型,并明确指出5005threadsPerl线程模型最终将被淘汰。本文后面所讨论的所有内容也都是基于新的ithreadsPerl线程模型。在ithreadsPerl线程模型中,最与众不同的特点就在于默认情况一下一切数据结构都不是共享的,这一点我们会在后面内容中有更深刻的体会。

现有环境支持哪种Perl线程模型

既然Perl中有可能存在两种不同的Perl线程模型,我们很自然地就需要判断现有Perl环境到底支持的是哪一种Perl线程实现方式。归纳起来,我们有两种方法:

在shell里,我们可以通过执行perl–V|grepusethreads命令来获取当前Perl线程模型的相关信息,例如

清单1.shell中查询Perl当前Perl线程模型    
 

  1. >perl-V|grepuse.*threads  
  2. config_args='-des-Doptimize=-O2-g-pipe-m32-march=i386-mtune=pentium4-Dversion=5.8.5  
  3. -Dmyhostname=localhost-Dperladmin=root@localhost-Dcc=gcc-Dcf_by=RedHat,Inc.  
  4. -Dinstallprefix=/usr-Dprefix=/usr-Darchname=i386-linux-Dvendorprefix=/usr  
  5. -Dsiteprefix=/usr-Duseshrplib-Dusethreads-Duseithreads-Duselargefiles-Dd_dosuid  
  6. -Dd_semctl_semun-Di_db-Ui_ndbm-Di_gdbm-Di_shadow-Di_syslog-Dman3ext=3pm-Duseperlio  
  7. -Dinstallusrbinperl-Ubincompat5005-Uversiononly-Dpager=/usr/bin/less-isr  
  8. -Dinc_version_list=5.8.45.8.35.8.25.8.15.8.0'  
  9. usethreads=defineuse5005threads=undefuseithreads=defineusemultiplicity=define  

 从结果中不难看出,在当前的Perl环境中提供了对ithreadsPerl线程模型的支持。

在Perl程序中,我们也可以通过使用Config模块来动态获取Perl线程模型的相关信息,例如

清单2.Perl程序中动态获取当前Perl线程模型    
 

  1. #!/usr/bin/perl  
  2. #  
  3. useConfig;  
  4.  
  5. if($Config{useithreads}){  
  6. printf("Helloithreads\n")  
  7. }  
  8. elsif($Config{use5005threads}){  
  9. printf("Hello5005threads\n");  
  10. }  
  11. else{  
  12. printf("Cannotsupportthreadinyourperlenvironment\n");  
  13. exit(1);  
  14. }  
  15.  

 值得一提的是,对于5005threads和ithreadsPerl线程模型,Perl同时只能支持其中的一种。你不可能在某一个Perl环境中同时使用这两种Perl线程模型。本文后面讨论的所有内容都是基于ithreadsPerl线程模型的。

【编辑推荐】

  1. 技术分享 如何创建Perl线程
  2. Perl文件句柄概念详解
  3. Perl线程队列和信号量概念解析
  4. 追踪调查 看Perl线程如何消亡
  5. 学习笔记 深入剖析Perl线程的生命周期

 

责任编辑:佚名 来源: ibm.com
相关推荐

2010-07-15 15:39:51

Perl线程

2010-07-16 10:44:54

Perl数组

2010-07-20 13:32:25

Perl编程格式

2022-02-22 19:04:01

Perl编程语言

2010-07-26 15:27:50

Perl foreac

2010-07-15 14:54:50

Perl线程

2010-07-26 17:09:00

Perl模块

2010-07-20 14:52:51

Perl语法

2010-07-14 10:41:58

Perl线程

2010-07-20 13:19:16

Perl入门手册

2010-07-21 11:04:44

Perl学习指南

2010-07-21 10:10:50

Perl split函

2010-07-26 13:27:19

Perl多线程

2010-07-26 11:19:19

Perl入门手册

2010-07-20 16:19:54

Perl

2010-07-23 15:51:27

Perl开发工具

2010-07-21 09:38:51

2010-07-19 15:25:39

Perl标量转换函数

2010-07-15 15:21:07

Perl线程

2010-07-16 17:23:57

Perl面向对象编程
点赞
收藏

51CTO技术栈公众号