Почему потоки Perl не работают, когда я заранее вызываю readdir? - PullRequest
1 голос
/ 26 декабря 2010

Всякий раз, когда я вызываю 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, просто вызов этого, кажется, все испортил.Когда я избавляюсь от этого, все, кажется, работает нормально.Пример кода приведен ниже:

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

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

sub sub1 {
print "in thread\n"
} 

Ответы [ 2 ]

4 голосов
/ 26 декабря 2010

Вам нужно использовать closedir, а не close, чтобы закрыть дескриптор каталога.Исправление, которое заставляет это работать правильно, хотя symtom, который я вижу с close (), немного отличается:

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

Однако, это все равно должно быть сообщено как ошибка, так как должно быть совершенно нормально оставитьдескриптор каталога, который будет автоматически закрыт в конце программы.

0 голосов
/ 26 декабря 2010

У вас будут проблемы с открытыми dirhandles со всеми версиями perl до последней (или двух) версии разработки - эта проблема была недавно исправлена.

P.S. Используйте лексические ручки.

...