perl实现多线程详解.doc_第1页
perl实现多线程详解.doc_第2页
perl实现多线程详解.doc_第3页
perl实现多线程详解.doc_第4页
perl实现多线程详解.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

查看文章Perl多线程2007-09-21 13:14利用threads包,可以很方便的实现多线程编程。不过今天发现threads包有一个问题,不能利用参数返回结果了。比如有这样一个子函数:sub foo my $v1 = shift; $v1-a = aa;如果我们这样调用它:my $res = ;&foo($res);print $res-a;就可以得到输出: aa可是如果使用线程: my $res = ;my $thread = threads-create(foo, $res); $thread-join();print $res-a;则不能正确返回结果。我猜测是因为threads对传入的变量进行了复制,而不是引用。这点等以后分析了threads包再确定。没有办法,如果确实要返回值的话,好采用如下的方式了:sub foo my $v1 = ; $v1-a = aa; return $v1;my $thread = threads-create(foo); my $res = $thread-join();print $res-a;=附文:Perl文简单多线程结构分析 = - use Thread; #导入Thread包 - $thread=Thread-new(&aaa,aaa,bbb); #新建多线程对象变量$thread,第一个参数是以子程序方式的结构体,后面跟的 #都是调用前面的那个子程序结构的实际参数。 - $result=$thread-join(); #召回线程的返回。无参数,$result变量为返回值。注意:线程本身不能调用自 #己的join()方法。 - $thread-detach(); #使分线程与主线程分离。无返回值,无参数。注意:调用此步后就不能再在其他 #线程调用关于这个线程的join()方法了。 - thread_list=$thread-list(); #返回正在运行的线程。无参数,返回值thread_list为正在运行的线程的列表。 - $thread=Thread-self(); #返回当前线程本身。无参数,返回值为当前线程的对象变量。 - $tid=$thread-tid(); #返回多线程对象的tid值(附:tid为线程独有的id记号)。无参数,返回值为线程 #的tid值。 - lock($aaa); #把进程中的某个变量锁住,以便某个线程不能改变其值。 - $thread=asyncBLOCK; #创造新线程的另一种方式。参数BLOCK为命令行格式,返回值为线程对象变量。 - = #实验:因为至今还不能很好地凌驾这种技术,因此不能提供良好的实验代码给大 #家,望大家见谅。 #!usr/bin/perl -w use IO:Socket; #导入IO:Socket包 use Thread; #导入Thread多线程处理包 $sock=IO:Socket:INET-new(Listen=10, #新建一个TCP、端口为5354、有10个监听队列的SOCKET LocalPort=5354, Proto=tcp); while(1) #进入典型的服务器循环体 next unless $client=$sock-accept; #ACCEPT Thread-new(&IandO,$client); #成功ACCEPT后,进入一个线程,线程为I/O会话部分 $client-close; #结束客户端的会话 $sock-close; #最后结束服务端SOCKET exit 1; #退出程序 sub IandO #线程核心子程序 my $handle=shift; #将线程调用的参数吸入到变量$handle Thread-self-detach; #分离线程 print $handle HI!n; #I/O操作 return; #返回主线程 #记住:服务端所谓多线程中的线程其实是指整个SOCKET中的I/O会话部分。 #注意线程核心子进程基本步骤:截取调用参数-分离主线程-I/O = 注意:在PERL5.X版下只有WIN32与部分*NIX支持多线程,MACPERL与部分*NIX还是不支持的。2用perl实现多线程(转) use strict; use English -no_match_vars; use Errno qw(EAGAIN); use threads; use threads:shared; my $items = 20; #需要处理的任务数 my $maxchild = 65; #最多线程数(1-65),perl最多允许64个子线程,加上主线程因此最多65个线程 my $pid; my $forks: shared = 1; #当前线程数 print startn; my $item: shared = 0; #当前处理任务序号,起始序号为0 my $myid = 1; #当前线程序号 my $main_pid = $PID; sub subprocess; #最多$maxchild个线程完成$items项任务 while ($item$items) FORK: #select undef,undef,undef,0.1; if ($forks$maxchild) & ($PID = $main_pid) #必须只允许主线程产生子线程 if ($pid = fork) #主线程处理 $| = 1; $forks+; $myid+; print Starting Sub_Process:($pid/$PID)n; elsif (defined $pid) #子线程处理 $| = 1; last unless (subprocess); elsif ($! = EAGAIN) #子线程未创建成功 print $!$forksn; # EAGAIN is the supposedly recoverable fork error sleep 5; redo FORK; else #不能创建子线程 # weird fork error die Cant fork: $!n; else #所有线程处理 last unless (subprocess); sub subprocess #由于$item是共享的且每个线程都能对其进行修改,因此为了保证当前线程任务序号的正确,必须将$item转入局部变量存储 my $s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论