2013-04-30 33 views
0

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

问题是:我将所有在文件中读取的内容保存为散列。 当我在sub(线程执行时)的读入后打印出大小(或键/值)时,它显示一个正确的数字> 0,当我在其他地方打印出散列的大小(在线程之后已经运行)它显示我0.

print ": ".keys(%c); 

被使用了2次,并且每次都有不同的输出。 (在最后PROGRAMM 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(); 
} 

我是否有第一2个线程之后要执行的程序在另一个线程完成,等待直到前两个完成? 或者我在做什么错误的线程?

谢谢。

回答

1

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

use threads; 
use threads::shared 

my %c :shared; 

参见threads::shared

+0

谢谢,它工作。不幸的是,它不会比在文件中一个接一个地读取更快,它甚至更慢...... – user1203092 2013-04-30 20:46:14

+0

非共享线程版本(即使它不正确)是否更快?共享数据确实有成本。每次访问哈希都会被锁定;当这种情况发生时,您可以有效地阻止其他线程。 您可能想在其他答案中尝试使用该方法,该方法建议从线程返回数据。这将完全隔离线程。 – 2013-05-01 13:45:15

1

在Perl中,线程不共享内存。每个线程在%c复制上运行,因此这些更改不会反映到父线程。虽然可以跨线程共享变量,但这通常不可取。

利用可能性返回来自线程的数据。 E.g

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在你的情况下,一个线程不是必需的。
+0

感谢您的建议,我已经做了几乎所有你写的内容,我只是不想复制整个脚本。我不知道的是,退出并不是必要的。 – user1203092 2013-04-30 20:54:05