perl实现多线程详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查看文章
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=async{BLOCK};
#创造新线程的另一种方式。
参数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
}elsif ($! == EAGAIN) { #子线程未创建成功
print "$!$forksn";
# EAGAIN is the supposedly recoverable fork error sleep 5;
redo FORK;
}else { #不能创建子线程
# weird fork error
die "Can't fork: $!n";
}
}else { #所有线程处理
last unless (subprocess);
}
}
}
sub subprocess {
#由于$item是共享的且每个线程都能对其进行修改,
因此为了保证当前线程任务序号的正确,必须将$item
转入局部变量存储
my $sid; #存储线程当前处理任务序号。
{
lock($item);
$sid = $item;
$item++ if ($item < $items);
}
if ($sid < $items) { #任务处理
print "Child process($PID/$myid)
start :$sid/$forksn";
print "$sidn";
sleep 1;
print "Child process($PID/$myid)
end :$sid/$forksn";
return 1;
}elsif ($main_pid == $PID) { #主线程结束
wait; #结束前等待所有子线程结束
print "Main process $$/$myid endn";
exit 1;
}else { #子线程结束
print "Child process($PID/$myid)
exit :$sid/$forksn";
exit 1;
}
}
类别:Perl | 添加到搜藏 | 浏览(255) | 评论 (0)
上一篇:别浪费你的大内存 合理给Windows... 下一篇:perl 安装模块
相关文章:
• A summary for perl thread modu... • perl 编程多线程端口扫描器--Perl...
• [原创][Perl]关于处理多进程,多... • PERL 铸造多线程 支持中文破解SQL...
• perl 编写多线程ftp 弱口令检测器 • Perl 铸造多线程中文SQL 注入猜解...
• 一段对perl 木马的分析 • Perl 学习
• Perl 程序 • zz:perl 多进程实战之四-Berkeley...
更多>>
最近读者:
登录
后,
您就出现在这
里。
sli_drbu laolun zhujian0805 jyf1987 chris_lshj。