mca*_*dre 6 linux perl multithreading segmentation-fault
我正在编写一个curses脚本,它需要在处理SIGINT后进行清理,以便将终端恢复到原始状态.
启用信号处理程序时,我得到一个段错误.
为了支持,我删除了所有的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"; }
Run Code Online (Sandbox Code Playgroud)
示例错误跟踪(90%的时间段为segfaults):
$ ./threadtest.perl
...
Creating this thread
Creating that thread
Detaching this thread
Detaching that thread
Creating this thread
^CSegmentation fault
$
Run Code Online (Sandbox Code Playgroud)
眼镜:
初步印象:
我认为当自定义信号处理程序获取控制权时会出现问题.这会以某种方式阻止创建下一个线程,从而导致段错误.
Perl的默认SIGINT处理程序是否运行特殊代码以安全地结束线程创建的评估?如果是这样,我想解决方案是将copypasta引入自定义处理程序.
该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
Run Code Online (Sandbox Code Playgroud)
这表明在 1.73 之前的版本中,线程创建和销毁期间的信号处理存在一个已知问题。升级你的threads模块。