我正在尝试获取两个大文件的文本。为了加速它,我尝试了线程。 在我使用线程脚本工作之前,现在没有。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个线程之后要执行的程序在另一个线程完成,等待直到前两个完成? 或者我在做什么错误的线程?
谢谢。
谢谢,它工作。不幸的是,它不会比在文件中一个接一个地读取更快,它甚至更慢...... – user1203092 2013-04-30 20:46:14
非共享线程版本(即使它不正确)是否更快?共享数据确实有成本。每次访问哈希都会被锁定;当这种情况发生时,您可以有效地阻止其他线程。 您可能想在其他答案中尝试使用该方法,该方法建议从线程返回数据。这将完全隔离线程。 – 2013-05-01 13:45:15