我想在循环中使用线程。我想要使用它的方法是在循环中启动线程并等待它们完成。一旦完成所有线程,然后休眠一段预定义的时间,然后再次启动这些线程。
实际上我想每小时运行一次这些线程,这就是我使用睡眠的原因。我也知道每小时运行可以通过cron完成,但我不能这样做所以我正在使用睡眠。
我在尝试运行代码时遇到此错误:
Thread already joined at ex.pl line 33.
Perl exited with active threads:
5 running and unjoined
0 finished and unjoined
0 running and detached
这是我的代码:
use strict;
use warnings;
use threads;
use Thread::Queue;
my $queue = Thread::Queue->new();
my @threads_arr;
sub main {
$queue->enqueue($_) for 1 .. 5;
$queue->enqueue(undef) for 1 .. 5;
}
sub thread_body {
while ( my $num = $queue->dequeue() ) {
print "$num is popped by " . threads->tid . " \n";
sleep(5);
}
}
while (1) {
my $main_thread = threads->new( \&main );
push @threads_arr, threads->create( \&thread_body ) for 1 .. 5;
$main_thread->join();
foreach my $x (@threads_arr) {
$x->join();
}
sleep(1);
print "sleep \n";
}
此外,我能够看到与此相似的其他问题,但我无法获得任何问题。
答案 0 :(得分:4)
加入前5个线程后,@threads_arr
数组永远不会被清除。第二次在循环中,旧的(已加入的)线程仍然存在于数组中,因此Perl在尝试连接它们时会抛出“Thread already joined”错误。每次循环清除或本地初始化@threads_arr
都可以解决问题。
@threads_arr=(); # Reinitialize the array
push @threads_arr, threads->create( \&thread_body ) for 1 .. 5;