#声明调用Threads类 use Threads; #定义一个测试数组 my @s = ("A","B","C","D","E","F"); #用于存储线程句柄的数组 my @t = (); #创建线程并push入@t存储 foreach $tmp(@s){ push @t,threads->create(\&slp,$tmp);} #子线程join到主线程,取得返回值并在线程结束后回收资源 foreach $tmp(@t){ $tmp->join();} #子函数,随机sleep一段时间,用于区分每个子线程完成顺序 sub slp{ print "@_, sleep: "; $tmp = int(rand(10)); sleep $tmp; print "$tmp\n"; }
下面转发一篇文章很全免的总结了Perl-Threads有关的资料。
张 融(IBM软件工程师): http://www.ibm.com/developerworks/cn/linux/l-cn-perl-thread/
线程概述
线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被 CPU 所调度的最小任务单元。线程与进程之间既有联系,又完全不同。简单地说,一个线程必然属于某一个进程,而一个进程包含至少一个或者多个线程。早期的计算机系统一次只能运行一个程序,因此,当有多个程序需要执行的时候,唯一的办法就是让它们排成队,按顺序串行执行。进程的出现打破了这种格局,CPU 资源按时间片被分割开来,分配给不同的进程使用。这样一来,从微观上看进程的执行虽然仍是串行的,但是从宏观上看,不同的程序已经是在并行执行了。如果我们把同样的思想运用到进程上,很自然地就会把进程再细分成更小的执行单位,即线程。由于一个进程又往往需要同时执行多个类似的任务,因此这些被细分的线程之间可以共享相同的代码段,数据段和文件句柄等资源。有了进程,我们可以在一台单 CPU 计算机系统上同时运行 Firefox 和 Microsoft Office Word 等多个程序;有了线程,我们可以使 Firefox 在不同的标签里同时加载多个不同的页面,在 Office Word 里编辑文档的同时进行语法错误检查。因此,线程给我们带来了更高的 CPU 利用率、更快速的程序响应、更经济地资源使用方式和对多 CPU 的体系结构更良好的适应性。
Perl 线程的历史
5005threads 线程模型
Perl 对线程的支持最早可以追溯到 1998 年 7 月发布的 Perl v5.005。其发布申明指出,Perl v5.005 中加入了对操作系统级线程的支持,这个新特性是一个实验性的产品,这也就是我们现在所称的 5005threads 线程模型。对于 5005threads 线程模型来说,默认情况下,所有数据结构都是共享的,所以用户必须负责这些共享数据结构的同步访问。如今 5005threads 已经不再被推荐实用,Perl v5.10 以后的版本里,也将不会再支持 5005threads 线程模型。
ithreads 线程模型
2000 年 5 月发布的 Perl v5.6.0 中开始引入了一个全新的线程模型,即 interpreter threads, 或称为 ithreads,也正是在这个版本的发布申明中第一次提出了 5005threads 线程模型将来可能会被禁用的问题。尽管如此,ithreads 在那个时候还是一个新的实验性的线程模型,用户并不能直接使用它,唯一的办法是通过 fork 函数模拟。经过两年时间的发展,到 2002 年 7 月,Perl v5.8.0 正式发布,这时 ithreads 已经是一个相对成熟的线程模型,发布申明中也鼓励用户从老的 5005threads 线程模型转换到新的 ithreads 线程模型,并明确指出 5005threads 线程模型最终将被淘汰。本文后面所讨论的所有内容也都是基于新的 ithreads 线程模型。在 ithreads 线程模型中,最与众不同的特点就在于默认情况一下一切数据结构都不是共享的,这一点我们会在后面内容中有更深刻的体会。
现有环境支持哪种线程模型
既然 Perl 中有可能存在两种不同的线程模型,我们很自然地就需要判断现有 Perl 环境到底支持的是哪一种线程实现方式。归纳起来,我们有两种方法:
1、在shell 里,我们可以通过执行 perl – V | grep usethreads 命令来获取当前线程模型的相关信息。
> perl -V | grep use.*threads config_args='-des -Doptimize=-O2 -g -pipe -m32 -march=i386 -mtune=pentium4 -Dversion=5.8.5 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Darchname=i386-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dinc_version_list=5.8.4 5.8.3 5.8.2 5.8.1 5.8.0'usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
从结果中不难看出,在当前的 Perl 环境中提供了对 ithreads 线程模型的支持。
在 Perl 程序中,我们也可以通过使用 Config 模块来动态获取 Perl 线程模型的相关信息,例如
2、Perl 程序中动态获取当前 Perl 线程模型
#!/usr/bin/perl # use Config; if( $Config{useithreads} ) { printf("Hello ithreads\n") } elsif( $Config{use5005threads} ) { printf("Hello 5005threads\n"); } else { printf("Can not support thread in your perl environment\n"); exit( 1 ); }
值得一提的是,对于 5005threads 和 ithreads 线程模型,Perl 同时只能支持其中的一种。
你不可能在某一个 Perl 环境中同时使用这两种线程模型。本文后面讨论的所有内容都是基于ithreads 线程模型的。
暂无评论