简单多线程结构分析 ============================================================================================================ ---------------------------------------------------------------------- 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还是不支持的。
|
|