初学perl多线程,请高手指点,为什么join后子线程还在运行?

初学perl多线程,请高手指点,为什么join后子线程还在运行?

小弟初学perl的多线程,边看大骆驼边写了几行试试,发现调用join后子线程仍然继续运行?请高手指点一下!注:win32系统
是否对join理解有误?还是代码问题?
use Thread;
print "新建线程!\n";
my $t=Thread->new(\&hello,,);
sleep(10);
print"收割线程!\n";
my $result=$t->join();
print"$result\n";
print"testing ok\n";
sub hello
    {   my $sum=0;
        while(1)
                 {
                   sleep(1);
                   print"$sum  hello,first thread program!\n";
                   $sum++;
                   if($sum>10){last;}
                 }
    }

执行结果如下:
新建线程!
0  hello,first thread program!
1  hello,first thread program!
2  hello,first thread program!
3  hello,first thread program!
4  hello,first thread program!
5  hello,first thread program!
6  hello,first thread program!
7  hello,first thread program!
8  hello,first thread program!
收割线程!
9  hello,first thread program!
10  hello,first thread program!

testing ok
join并不是杀死子线程,而是等待子线程退出。
你把子线程写成死循环试试就明白了。
哦,还是理解有误,谢谢!
再请教下,我怎么强制杀死子线程呢?
发送kill信号
你怎么发现调用join之后了子程序还在run?

我看输出很正常,join之后,hello程序不是停了么?
可以用 threads->exit() 退出thread?

threads->exit()

    If needed, a thread can be exited at any time by calling threads->exit(). This will cause the thread to return undef in a scalar context, or the empty list in a list context.

    When called from the main thread, this behaves the same as exit(0).
如2楼大哥所说的,我把hello改成死循环后,在主线程调用join后,信息还是一直在打印。

我改用$t1->detach();后就可以达到我要的效果了

我实际是想开一个线程作其他操作,而主线程做监控线程,如果发现子线程完成了,就进行join操作,
若子线程运行超时,则主线程将强制杀掉子线程。

这样改一下代码就可以了
use Thread;
print "新建子线程!\n";
my $t1=Thread->new(\&hello,,);
print"等待子线程返回\n";  
my $num=0;
      while(1)
              {
                sleep(1);
                if ($t1->is_joinable()) {   
                                             print"正常收割线程!\n";
                                             $t1->join();
                                             last;
                                        }
                else {
                            $num++;
                            if($num>20){
                                               print"返回超时,强制终止子线程运行!\n";
                                           $t1->detach();
                                           last;
                                       }
                     }
              }
print"testing ok\n";

sub hello
    {   my $sum=0;
        while(1)
                 {
                   sleep(1);
                   print"$sum  hello,first thread program!\n";
                   $sum++;
                   if($sum>30){last; }
                 }
        return 1;
    }

但是为什么detach能够强制子线程停止运行,还是不太明白。
你说的好像不对,join是等待线程中止,所以如果你的hello是个无穷循环,join就应该死等才是

另外,值得注意的是不要用Thread (deprecated),现在最好用threads module。

detach function是把这个线程“放弃”,程序结束的时候,这个线程会瞧瞧的中止。detach不会去主动中止这个线程。