【发布时间】:2016-06-07 00:49:57
【问题描述】:
我有一个挂在 perl 5.16.3 上的小示例程序。我正在尝试使用alarm 来触发如果两个线程在一个更复杂的程序中没有及时完成工作,但这归结为它的要点。我知道还有很多其他方法可以做到这一点,但为了争论,假设我坚持使用代码。我不确定这是否是 perl 中的错误,或者某些合法不应该工作的东西。
我在互联网上对此进行了研究,似乎通常不鼓励混合警报和线程,但我看到很多例子,人们声称这是完全合理的做法,例如 this other SO question ,Perl threads with alarm。已接受的关于该问题的答案中提供的代码也挂在我的系统上,这就是为什么我想知道这是否是现在已经损坏的东西,至少从 5.16.3 开始。
在下面的代码中,如果我在alarm 关闭之前调用join,alarm 将永远不会触发。如果我将join 替换为while(1){} 并进入忙等待循环,那么alarm 会正常关闭,因此join 似乎出于某种原因阻塞了SIGALRM。
我的预期是join 发生,然后几秒钟后我看到“警报!”打印在屏幕上,但这永远不会发生,只要在 alarm 关闭之前调用 join。
#!/usr/bin/env perl
use strict;
use warnings;
use threads;
sub worker {
print "Worker thread started.\n";
while(1){}
}
my $thread = threads->create(\&worker);
print "Setting alarm.\n";
$SIG{ALRM} = sub { print "Alarm!\n" };
alarm 2;
print "Joining.\n";
$thread->join();
【问题讨论】:
-
我仍然不相信这是“完全合理的”,因为它们来自两种不同型号的 IPC。
标签: multithreading perl