冰雪塵埃snowtty.blog.chinaunix.net
snowtty
全部博文(1144)
openvpn(0)
nagios(10)
2017年(2)
2016年(14)
2015年(10)
2014年(28)
2013年(23)
2012年(29)
2011年(53)
2010年(86)
2009年(83)
2008年(43)
2007年(153)
2006年(575)
2005年(45)
skylway
anderson
dongfeng
snailonr
xy1121
叶绍琛
Julielov
lxw0109
haiyangc
wb123456
liangbo
xxinganl
lostwolf
tttxxx
ThorMana
snoopy52
wojiuzhu
分类: LINUX
2010-09-12 10:27:59
在perl里面等待没有detach的线程好说,直接join等待退出就可以了。但是对于被detach过的,就比较麻烦一点了。因为主函数退出的时候是不管被detach了的线程是否完成的,没有完成就强制杀死,可能会导致程序工作结果不对。可是detach线程又是不可避免的,我尤其喜欢这么做,主要原因是因为我懒,不想保存一个数组,然后去挨个儿去收割,麻烦啊。况且detach掉之后,线程结束时系统自动回收资源,更是美事一桩。 今天测试一个小程序的时候,想到既然一般使用信号量来控制并发线程数量,那么应该也可以用信号量作为事件,来等待线程结束啊。写了个脚本测试一下,确实可行。在所有线程创建完毕,主程序要退出之前,尝试获得最大线程数量个信号,无法获得的时候会阻塞,直到成功获得。这是因为一共创建了最大并发线程数个信号量,而一个线程占用一个信号量,线程退出的时候才释放。如果能够获得到原始个数,就表示所有线程都释放了,所有线程处理完毕,程序可以结束了。
#!/usr/bin/perl use strict; use warnings; use threads; use Thread::Semaphore; my $max_thread = 4; my $semaphore = new Thread::Semaphore( $max_thread ); sub TestFun { my $num = shift; my $count = 1; while( $count <= 3 ) { print "print $num $count times in thread ".threads->self()->tid()."n"; sleep( 1 ); $count ++; } # 线程技术,释放一个信号量 $semaphore->up( ); } sub Wait2Quit { print "Waiting to quit...n"; my $num = 0; while( $num < $max_thread ) { # 尝试获取信号量,当能够获取到最大线程数个信号量时,表示所有线程都结束了 $semaphore->down( ); $num ++; print "$num thread quit.n"; } print "All $max_thread thread quit.n"; } for( my $index = 1; $index <= 10; $index ++) { # 获取一个信号量,控制并行的线程数量 $semaphore->down( ); my $thread = threads->create( &TestFun, $index ); # 剥离线程,不关心返回值,系统自动回收资源 $thread->detach(); } Wait2Quit( );
上一篇:use IPC::Shareable
下一篇:第一个多线程抓取程序
登录 注册