你如何在线程perl中共享数组?

时间:2014-01-07 18:07:05

标签: multithreading perl

在下面的sub(导致错误的代码的简化版本)中,每个线程应该添加到主输出列表。在sub中,数组似乎正在填充,但是当我回到主调用部分时,它又是空的。我做错了什么?

#!/usr/bin/env perl

use threads;
use strict;

my $num_threads = 8;
my @threads = initThreads();
our @outputArray;

foreach(@threads){
    $_ = threads->create(\&do_search);
}

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

print "@outputArray";

sub initThreads{
    # An array to place our threads in
    my @initThreads;
    for(my $i = 1;$i<=$num_threads+1;$i++){
        push(@initThreads,$i);
    }
    return @initThreads;
}

sub do_search{
    my $id = threads->tid();
    push(@outputArray,$id);
    threads->exit();
}

1 个答案:

答案 0 :(得分:4)

根据threads::shared documentation引用的@mpapec

  

默认情况下,变量对每个线程都是私有的,每个都是新的   创建的线程获取每个现有变量的私有副本。

所以解决方案是模块:

use threads::shared ;

our @outputArray :shared ;

您可以使用其他形式和许多限制,因此建议阅读整篇文档。