本文和大家重点讨论一下Perl线程的消亡的概念,如果想让Perl线程正常退出,这就意味着Perl线程所对应的函数体在执行完毕后返回并释放资源。
Perl线程的消亡
大多数情况下,你希望你创建的Perl线程正常退出,这就意味着Perl线程所对应的函数体在执行完毕后返回并释放资源。例如在清单5的示例中,新建Perl线程被join以后的退出过程。可是,如果由于detach不当或者由于主线因某些意外的异常提前结束了,尽管它所创建的Perl线程可能尚未执行完毕,但是他们还是会被强制中止,正所谓皮之不存,毛将焉附。这时你也许会得到一个类似于“Perlexitedwithactivethreads”的警告。
当然,你也可以显示地调用exit()方法来结束一个Perl线程,不过值得注意的是,默认情况下,如果你在一个Perl线程中调用了exit()方法,其他Perl线程都会随之一起结束,在很多情况下,这也许不是你想要的,如果你希望exit()方法只在调用它的Perl线程内生效,那么你在创建该Perl线程的时候就需要设置’exit’=>’thread_only’。例如
清单7.为某个Perl线程设置’exit’=>’thread_only’属性
- #!/usr/bin/perl
- #
- usethreads;
- subsay_hello{
- printf("Hellothread!@_.\n");
- sleep(10);
- printf("Bye\n");
- }
- subquick_exit{
- printf("Iwillbeexitinnotime\n");
- exit(1);
- }
- my$t1=threads->create(\&say_hello,"param1","param2");
- my$t2=threads->create({'exit'=>'thread_only'},\&quick_exit);
- $t1->join();
- $t2->join();
如果你希望每个Perl线程的exit方法都只对自己有效,那么在每次创建一个新Perl线程的时候都去要显式设置’exit’=>’thread_only’属性显然有些麻烦,你也可以在引入threads包的时候设置这个属性在全局范围内有效,例如
清单8.设置’exit’=>’thread_only’为全局属性
- usethreads('exit'=>'threads_only');
- subfunc{
- ...
- if($condition){
- exit(1);
- }
- }
- my$t1=threads->create(\&func);
- my$t2=threads->create(\&func);
- $t1->join();
- $t2->join();
【编辑推荐】