Board logo

标题: Perl 中的线程(1) [打印本页]

作者: look_w    时间: 2018-6-13 13:55     标题: Perl 中的线程(1)

线程概述线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被 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 当前线程模型
1
2
3
4
5
6
7
8
9
10
11
> 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 线程模型的支持。
清单 2. Perl 程序中动态获取当前 Perl 线程模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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 线程模型的。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0