Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl中的多线程管理_Multithreading_Perl_Join_Semaphore - Fatal编程技术网

Multithreading Perl中的多线程管理

Multithreading Perl中的多线程管理,multithreading,perl,join,semaphore,Multithreading,Perl,Join,Semaphore,Perl对已经完成任务的线程到底做了什么?它是让它闲置还是杀死它?下面我有一个基本的代码结构,我想知道如何最好地优化它 use threads; use Thread::Semaphore my $s = Thread::Semaphore->new($maxThreads); my @threads; my $thread; foreach my $tasktodo (@tasktodo) { $s->down(); $thread = threads->new(

Perl对已经完成任务的线程到底做了什么?它是让它闲置还是杀死它?下面我有一个基本的代码结构,我想知道如何最好地优化它

use threads;
use Thread::Semaphore

my $s = Thread::Semaphore->new($maxThreads);
my @threads;
my $thread;

foreach my $tasktodo (@tasktodo) {
  $s->down();
  $thread = threads->new(\&doThis);
  push @threads, $thread;
}

foreach my $thr (@threads) {
  $thr->join();
}

sub doThis {
  # blah blah
  # completed, gonna let more threads run with $s->up()
  $s->up();
}
在这种情况下,一旦一个线程完成,我想释放更多的资源来运行更多的线程。我担心在循环结束时连接线程。如果在整个程序生命周期中,它将创建4个线程,那么在加入时,
@threads
中还会有4个线程吗

假设
$maxThreads
是2,它将运行2个线程,那么当这2个线程完成时,它将被终止并运行另外2个线程。最后,它将只加入或等待这两个线程运行


编辑:我也不关心这些线程的返回值,这就是为什么我想释放资源。我加入的唯一原因是我希望在继续脚本之前完成所有线程。同样,这是最好的实现吗?

终止线程的常用方法是使用适当的返回值从入口点函数返回EXPR

join函数等待这个返回值,并清理线程。所以,在我看来,你的代码是好的

退出线程的另一种方法是:

threads->exit(status);
此外,您还可以通过以下方式获得可连接线程的列表:

threads->list(threads::joinable);

终止线程的常用方法是使用适当的返回值从入口点函数返回EXPR

join函数等待这个返回值,并清理线程。所以,在我看来,你的代码是好的

退出线程的另一种方法是:

threads->exit(status);
此外,您还可以通过以下方式获得可连接线程的列表:

threads->list(threads::joinable);

请叫它
Perl
,而不是
Perl
Perl
至少
Pearl
对不起,现在我知道了。你能回答我的问题吗?请叫它
Perl
,而不是
Perl
Perl
至少
Pearl
对不起,现在我知道了。你能回答我的问题吗?谢谢,我对此感到不确定。我知道退出线程,但我不知道是否有必要在线程结束时退出(因为它现在正在工作,我还没有对它进行压力测试,很快就会)。谢谢,我对此感到不确定。我知道退出线程,但我不知道是否有必要在线程结束时退出(因为它现在正在工作,我还没有对它进行压力测试,很快就会)。