multithreading - 基本的Perl线程: threads->list() does not decrease

标签 multithreading perl

看来thread_sleep未正确结束。

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

该代码永无止境,因为threads->list()的大小从不减少。

use strict;
use warnings;

use Thread;

my @threads;

my $count = 0;

while ( scalar( @threads ) < 10 ) {

    my $thr = threads->create( 'thread_sleep' );
    push @threads, $thr;
    $count++;

    print "Spawned Thread nr. $count\n";

    while ( threads->list() > 4 ) {
        print "too many threads, sleeping a second...\n";
        sleep( 1 );
    }
}

sub thread_sleep {
    sleep( 5 );
}

最佳答案

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

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

(或者,考虑使用Parallel::ForkManager管理多个工作进程。Perl解释器线程比较困惑,最好避免使用。)

关于multithreading - 基本的Perl线程: threads->list() does not decrease,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47760887/

相关文章:

perl - 如何将数组转换为散列,并将变量名映射为 Perl 中的键?

perl - 如何将光标移回终端中的一个位置?

perl - 设置 Perl 导出常量

java - 线程执行后刷新TableView

java - spring 集成超时客户端

python - 提高多线程 Web 服务器的性能

Perl 评论家 : Comma used to separate statements

multithreading - 在 Kotlin 中停止线程

multithreading - Webkit 必须始终在主线程上使用吗?

perl - 打开位于同一目录中的文件时出错