Почему мой многопоточный сценарий Perl segfault?

Я пишу сценарий curses, который требует очистки после обработки SIGINT, чтобы вернуть терминал в исходное состояние.

Я получаю segfault, когда включен обработчик сигнала.

Для ради поддержки, Я удалил весь код curses, чтобы решить проблему.

Код:

#!/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 thread\n";

    my $t = threads->create(\&run);

    print "Created that thread\n";
}

while (1) { print "Looping\n"; }

Образец трассировки ошибок (ошибки в 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 Squeeze

Начальное впечатление:

Я думаю, что проблема возникает, когда пользовательский обработчик сигналов захватывает управление. Это каким-то образом предотвращает создание следующего потока, что приводит к ошибке segfault.

Выполняет ли обработчик SIGINT Perl по умолчанию специальный код для безопасного завершения оценки создания потока? Если так, то я полагаю, что решение состоит в том, чтобы скопировать пасту в специальный обработчик.

6
задан mcandre 18 February 2011 в 18:57
поделиться