Почему мой потоковый скрипт Perl segfault?
Я пишу сценарий curses, который требует очистки после обработки SIGINT, чтобы вернуть терминал в исходное состояние.
Я получаю segfault, когда обработчик сигнала включен.
ради поддержки я удалил весь код проклятий, чтобы свести проблему к минимуму.
код:
#!/usr/bin/env perl
use strict;
use warnings;
use threads;
sub cleanup { exit 0; }
sub run { while (1) {} }
# comment this line and the problem disappears
$SIG{INT} = &cleanup;
foreach my $i (1..100) {
print "Creating this threadn";
my $t = threads->create(&run);
print "Created that threadn";
}
while (1) { print "Loopingn"; }
пример трассировки ошибки (segfaults 90% времени):
$ ./threadtest.perl
...
Creating this thread
Creating that thread
Detaching this thread
Detaching that thread
Creating this thread
^CSegmentation fault
$
технические характеристики:
- потоки 1.72
- archname ""
- os""
- Perl 5.10.1 (поставляется с Debian) Debian
- 6 протиснуться
Первое Впечатление:
Я думаю, что проблема возникает, когда пользовательский обработчик сигнала захватывает управление. Это каким-то образом предотвращает создание следующего потока, что приводит к segfault.
выполняет ли обработчик SIGINT Perl по умолчанию специальный код для безопасного завершения оценки создания потока? Если да, то я представляю решение copypasta в пользовательский обработчик.
1 ответов
на история изменений для threads
модуль содержит:
1.73 Mon Jun 8 13:17:04 2009
- Signal handling during thread creation/destruction (John Wright)
- Upgraded ppport.h to Devel::PPPort 3.17
что предполагает, что была известная проблема с обработкой сигнала во время создания и уничтожения потока в версиях ранее 1.73. Обновите свой threads
модуль.