为什么Perl线程在我事先调用readdir时不工作?

时间:2010-12-26 03:47:14

标签: multithreading perl readdir

每当我在创建线程之前调用readdir时,我都会收到如下错误:

perl(2820,0x7fff70c33ca0) malloc: *** error for object 0x10082e600: pointer 
being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap

奇怪的是,当我在创建线程之前调用readdir(即在任何并发代码中都没有调用readdir)时会发生这种情况。我甚至没有使用readdir的结果,只是调用它似乎搞砸了。当我摆脱它,事情似乎工作正常。下面是一些示例代码:

opendir(DIR, $someDir);
my @allFiles = readdir(DIR);
close(DIR);

my $thread = threads->create(\&sub1);
$thread->join();

sub sub1 {
print "in thread\n"
} 

2 个答案:

答案 0 :(得分:4)

您需要使用closedir而不是close来关闭目录句柄。 修复使得这个工作正常,虽然我用close()看到的symtom有点不同:

*** glibc detected *** perl: double free or corruption (!prev): 0x09bc7d28 ***

然而,这应该仍然被报告为一个错误,因为在程序结束时让目录句柄自动关闭应该是完全可以的。

答案 1 :(得分:0)

对于所有版本的perl直到最新(或两个)开发版本,你会遇到打开的dirhandle问题 - 这个问题最近已修复。

P.S。使用词法手柄。