在循环中使用线程

时间:2015-08-10 23:02:58

标签: multithreading perl

我想在循环中使用线程。我想要使​​用它的方法是在循环中启动线程并等待它们完成。一旦完成所有线程,然后休眠一段预定义的时间,然后再次启动这些线程。

实际上我想每小时运行一次这些线程,这就是我使用睡眠的原因。我也知道每小时运行可以通过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";
}

此外,我能够看到与此相似的其他问题,但我无法获得任何问题。

1 个答案:

答案 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;