追蹤調查 看Perl線程如何消亡
本文和大家重點討論一下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();
【編輯推薦】