Почему мой потоковый скрипт 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 модуль.