Multithreading 基本perl线程:线程->;list()不会减少

Multithreading 基本perl线程:线程->;list()不会减少,multithreading,perl,Multithreading,Perl,看起来thread\u sleep没有正确结束 我可以使用线程队列、信号量等来处理它,但我对这里可能存在的问题感兴趣 这段代码永远不会结束,因为threads->list()大小永远不会减小 使用严格; 使用警告; 使用螺纹; 我的@threads; 我的$count=0; while(标量(@threads)create('thread_sleep'); 推送@threads,$thr; $count++; 打印“衍生线程编号$count\n”; 而(线程->列表()>4){ 打印“线程太多,

看起来
thread\u sleep
没有正确结束

我可以使用线程队列、信号量等来处理它,但我对这里可能存在的问题感兴趣

这段代码永远不会结束,因为
threads->list()
大小永远不会减小

使用严格;
使用警告;
使用螺纹;
我的@threads;
我的$count=0;
while(标量(@threads)<10){
my$thr=threads->create('thread_sleep');
推送@threads,$thr;
$count++;
打印“衍生线程编号$count\n”;
而(线程->列表()>4){
打印“线程太多,睡眠一秒…\n”;
睡眠(1);
}
}
子线程睡眠{
睡眠(5);
}

线程的工作方式与进程非常相似——在一个线程退出后,它作为“僵尸”线程留在线程列表中,直到另一个线程(不一定是其父线程)调用
$thr->join
以收集其返回值

您没有在任何地方调用
$thr->join
,因此这些线程正在堆积。您可以使用
threads->list(threads::joinable)
来检查哪些线程已经退出并且现在可以连接


(或者,考虑使用<代码>并行::FrkMasks/Cuffer>管理多个工作进程。Perl解释器线程是凌乱的,最好避免。)线程工作非常类似进程——在线程退出之后,它作为线程“线程”在线程列表中停留,直到另一个线程(不必是它的父线程)。调用

$thr->join
以收集其返回值

您没有在任何地方调用
$thr->join
,因此这些线程正在堆积。您可以使用
threads->list(threads::joinable)
来检查哪些线程已经退出并且现在可以连接


(可选地,考虑使用<代码>并行::FrkMasks/Cuffer>管理多个工作进程。Perl解释器线程是凌乱的,最好避免。)/P> < P>您依赖于一个非常过时的Perl模块,该模块在1998中被引入,并在2007中从内核中删除。您不会说您正在运行哪个版本的Perl,但软件的工作方式与汽车不同,在汽车上,一个非常古老的版本的原始示例是值得称赞的

您需要更新您的安装

模块会这样说(原始标记)

已弃用

Thread
模块作为旧式线程模型(称为5005threads)的前端,该模型在5.005版中引入。该模型已被弃用,并已在5.10版中删除

对于旧代码和临时向后兼容性,线程模块已被重新设计为充当新解释器线程(ithreads)模型的前端。但是,以前的某些功能不可用。此外,两个线程模型之间的数据共享模型完全不同,任何与数据共享有关的内容都必须有不同的想法。使用ithreads,必须在线程之间显式地
share()
变量

强烈建议您尽快将任何现有线程代码迁移到新模型(即使用
线程
线程::共享
模块)


您所依赖的是一个非常过时的Perl模块,该模块于1998年引入,并于2007年从core中删除。您不会说您正在运行哪个版本的Perl,但软件的工作方式与汽车不同,在汽车上,一个非常古老的版本的原始示例是值得称赞的

您需要更新您的安装

模块会这样说(原始标记)

已弃用

Thread
模块作为旧式线程模型(称为5005threads)的前端,该模型在5.005版中引入。该模型已被弃用,并已在5.10版中删除

对于旧代码和临时向后兼容性,线程模块已被重新设计为充当新解释器线程(ithreads)模型的前端。但是,以前的某些功能不可用。此外,两个线程模型之间的数据共享模型完全不同,任何与数据共享有关的内容都必须有不同的想法。使用ithreads,必须在线程之间显式地
share()
变量

强烈建议您尽快将任何现有线程代码迁移到新模型(即使用
线程
线程::共享
模块)


好吧,直到过程结束。但是是的,threads->list(threads::running)非常适合我的用例,不管怎样,答案是完美的,非常感谢@Daskwuff:你真的不应该忽视
线程
而不是
线程
的使用。模块坏了,而pragma有点不太好。@Borodin哦,哇,我错过了
使用线程
行——代码似乎只引用
线程
,但……确实是这样。但是当它被认为是十年前代码的桥接模块时,使用
线程仍然是不合适的!查看我的(非)答案。好吧,直到进程退出。但是是的,threads->list(threads::running)非常适合我的用例,不管怎样,答案是完美的,非常感谢@Daskwuff:你真的不应该忽视
线程
而不是
线程
的使用。模块坏了,而pragma有点不太好。@Borodin哦,哇,我错过了
使用线程
行——代码似乎只引用
线程
,但……确实是这样。但是当它被认为是十年前代码的桥接模块时,使用
线程仍然是不合适的!看我的(非)答案。哦,我没有意识到这一点。我一定要使用5.8(我知道这很愚蠢),但它已经有线程了。哦,我没有意识到这一点。我一定要使用5.8(我知道这很愚蠢),但它已经有线程了。