multithreading - Perl 中的线程 : order of detach()

标签 multithreading perl sleep

我正在尝试了解 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/

相关文章:

java - 为什么 Display.asyncExec 或 Display.asyncExec 的 Object#wait 不是 "reasonable opportunity"?

java - 为什么我的 boolean 变量在停止线程循环时应该是易变的?

java - 让线程 hibernate 不同的时间

android - 如何使用循环器创建后台线程

perl - 在 Perl 中深度复制散列的最佳方法是什么?

perl - 如何创建文本文件,以便在 Excel 中打开该文件时,行会分组在一起?

perl - Net::FTPSSL 在命令 channel [0] (0, 1) () 上给出错误 Unexpected EOF...

java - 混淆等待、通知和 hibernate

c++ - EnterCriticalSection死锁

multithreading - QThread 在主线程上休眠