【发布时间】:2017-07-01 17:05:27
【问题描述】:
我正在尝试了解 Perl 对线程的使用。阅读documentation我遇到了以下代码:
use threads;
my $thr = threads->create(\&sub1); # Spawn the thread
$thr->detach(); # Now we officially don't care any more
sleep(15); # Let thread run for awhile
sub sub1 {
my $count = 0;
while (1) {
$count++;
print("\$count is $count\n");
sleep(1);
}
}
目标似乎是创建一个运行 sub1 15 秒的线程,同时打印一些字符串。但是,我认为我不明白程序结束时发生了什么。
首先detach()定义如下:
一旦线程被分离,它将一直运行直到完成;然后是 Perl 之后会自动清理。
但是,子程序何时结束? while(1) 永远不会结束。我也没有在sleep() 中找到任何会导致循环中断的信息。最重要的是,从我们分离的那一刻起,我们“等待脚本完成然后清理它”15 秒,所以如果我们 等待 子例程完成,为什么我们要在主脚本中需要sleep()?这个位置对我来说很尴尬;它表明主程序休眠 15 秒。但这有什么意义呢?主程序(线程?)休眠,子线程继续运行,那么子程序又是如何终止的呢?
我想这个想法是在sleep-ing 完成后,子程序结束,之后我们可以分离/清理。但是这在语法上是如何清晰的呢?在 sleep 的定义中,sleep 终止了一个子程序(以及为什么),如果有多个线程,它如何知道要终止哪个?
【问题讨论】:
标签: multithreading perl sleep