Perl 的多线程怎么等待任意一个子线程退出

Perl 的多线程怎么等待任意一个子线程退出,第1张

其实不是很明白您的问题, 不过 perl 的多线程 (threads) 主要就三个状态, create(创建), 和陆历迅 joinnable(可合流) 和 join(合流). 除了 join, 还有 yield, detach 那些, 但这里先早此不讨论了.

$|=1

use threads

my $th1 = threads->create(sub {

    for ( 0..9 ) {

        print "$_ " sleep 1

    }

})

my $th2 = threads->create(sub {

    for ( 'a'..'z' ) {

        print "$_ " sleep 1

    }

})

#以上就建构了 2 条 thread.它们会在最快的时间内开始起动, 主线(main)会继续运行

sleep 1 # 但为了防止在完成起动前在 main 就被 join 了, 

# 所以通常会 sleep 一点点的时间等上面的 threads 都完成起动

#以上两条 thread 完成後, 就变成 joinnable 状态

$th1->join # 合流

$th2->join # 合流

# perl 为防止不小心做成孤儿/丧屍thread, 所以用 threads 时, 

# 必需要明确写出 join 的时机烂派, 否则程序完结时会有 warning 字句出现.

给两个思路,第一个就是每个生成的子进程的pid都保存在主进程里面,例如保存在数组里。

然后,在load数据之前,用kill函数将0号信号发送给每个子进程斗穗。kill函数的0号信号不会发送真正的信号,只是测试能否向某个进程发送信号。这样,如果每个子进程都已经退出,那么对每个子进程进行kill 0都会得到假值,这样就可以load你的数据了。

第二个是思路是,设置一斗旅个全局变量,CHLD信号收割子进程时,每捕获一次便将全局变量加1。这时主进程就只要记录生成的子进程的个数,这样在load时判断全局变量与子进程的个数是否相等,若相等就代表子进程已经退出完毕了。当然,这种方法不会很保险,有可能两个或以上的子进程同时被收割,但全局变量只加了1,这样就会造成全局变量与子进程数空销卜永远都不相等而造成程序无限挂起……


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12413900.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存