我正在尝试了解 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()
定义如下:
Once a thread is detached, it'll run until it's finished; then Perl will clean up after it automatically.
但是,子程序什么时候结束? while(1)
永远不会结束。我也没有在 sleep()
中找到任何信息它会导致打破循环。最重要的是,从我们分离的那一刻起,我们正在“等待脚本完成然后清理它”15 秒,所以如果我们等待子例程完成,我们为什么要需要在主脚本中使用 sleep()
吗?这个位置对我来说很尴尬;它建议主程序休眠 15 秒。但这有什么意义呢?主程序(线程?)休眠,子线程继续运行,但子程序如何终止?
我想这个想法是在 sleep
-ing 完成后,子例程结束,之后我们可以分离/清理。但这在语法上如何清晰呢?在 sleep 的定义中哪里说 sleep
终止了一个子程序(以及为什么),如果有多个线程,它如何知道要终止哪个子程序?
最佳答案
程序结束时所有线程结束。当主线程结束时程序结束。主线程中的 sleep
只是让程序运行一小段时间,之后主线程(因此是程序,因此是所有创建的线程)也会结束。
那么 detach
是怎么回事?它只是说“我永远不会费心加入这个线程,我不在乎它返回什么”。如果您既不分离
线程也不加入
它,程序结束时您会收到警告。
关于multithreading - Perl 中的线程 : order of detach(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208690/