Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541276
  • 博文数量: 81
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 866
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-25 09:08
个人简介

www.cloud86.cn

文章分类

全部博文(81)

文章存档

2017年(2)

2014年(1)

2011年(1)

2007年(5)

2006年(31)

2005年(41)

我的朋友

分类:

2006-08-28 14:18:45

[Perl文]简单多线程结构分析

writer: demonalex
email: demonalex_at_hackermail.com


=============================================================================================================
----------------------------------------------------------------------
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
=============================================================================================================
注意:在PERL5.X版下只有WIN32与部分*NIX支持多线程,MACPERL与部分*NIX还是不支持的。

阅读(2371) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~