0

我正在尝试获取两个大文件的文本。为了加快速度,我尝试了线程。在我使用线程之前,脚本工作,现在它没有。

问题是:我将在文件中读取的所有内容都保存到哈希中。当我在子程序(线程执行)中读入后打印出大小(或键/值)时,它显示正确的数字> 0,当我在其他任何地方打印出散列的大小时(在线程有运行)它显示我为 0。

print ": ".keys(%c);

使用2次,每次输出不同。(在最终的程序中,有 2 个线程正在运行,并且在线程完成后调用了一个比较东西的方法)

示例代码:

   my %c;
   my @threads = initThreads();

   @threads[0] = threads->create(\&ce);

foreach(@threads){
    $_->join();
}
print ": ".keys(%c);


sub initThreads{
    my @initThreads;

    for(my $i = 0; $i<2;$i++){
            push(@initThreads, $i);
    }
return @initThreads;
}

sub ce(){
    my $id = threads->tid();

    open my $file, "<", @arg1[1] or die $!;

    my @cXY;
    my @cDa;

    while(my $line = <$file>){

# some regex and push to arrays, works
            @c{@cXY} = @cDa;

    }

    print "Thread $id is done\n";
    close $file;

print ": ".keys(%c);
    threads->exit();
}

我是否必须在前两个线程完成后在另一个线程中运行这些东西,等待前两个线程完成?或者我在线程上做错了什么?

谢谢。

4

2 回答 2

1

在 Perl 中,线程不共享内存。每个线程对 的不同副本进行操作%c,因此更改不会反映到父线程。虽然跨线程共享变量是可能的,但这通常是不可取的。

利用从线程返回数据的可能性。例如

my %c = map %{ $_->join }, @threads; # flatten all returned hashes

sub ce {
  my %hash; 
  ...;
  return \%hash;
}

其他一些建议:

  • use strict; use warnings;如果你还没有。
  • 使用更好的变量名。
  • 你似乎只产生一个线程(在$threads[0])。
  • my @array; for (my $i = 0; $i < 2; $i++){ push(@array, $i) }相当于my @array = 0 .. 1
  • @arg1未在当前范围内声明。
  • exit在您的情况下,不需要手动创建线程。
于 2013-04-30T20:28:13.823 回答
1

%c不会在您的线程之间共享。

use threads;
use threads::shared

my %c :shared;

请参阅线程::共享

于 2013-04-30T20:30:53.630 回答