并非所有线程都完成,可能是因为没有锁定STDOUT

时间:2014-06-27 19:41:30

标签: multithreading perl

我正在使用perl中的线程进行实验。下面的代码基本上创建了n个线程并为它们分配了相同的函数(它们应该并行执行)。

扭曲:该功能只是打印一些东西。这意味着他们无法并行完成。老实说我很好,因为我刚刚开始用它们做事,但并非所有线程似乎都完成了。我想这是因为我没有把STD锁定,这就是为什么会出现一些混乱的原因。这可能不是原因。在任何情况下,每次都不会完成不同的线程安装。

如果我是正确的,我怎么能锁定标准输出(当我尝试使用锁定功能时出错)?

如果我错了,为什么所有线程都没有完成,我该如何解决?

代码:

use strict;
use threads ('yield',
                 'stack_size' => 64*4096,
                 'exit' => 'threads_only',
                 'stringify');
use threads::shared;


sub PrintTestMessage()
{
    print "Hello world\n";
}

my @t;
push @t, threads->new(\&PrintTestMessage) for 1..10;

我获得了10次hello world,但是在程序结束后我获得了不同的输出:

Perl exited with active threads:
    1 running and unjoined
    9 finished and unjoined
    0 running and detached
Perl exited with active threads:
    8 running and unjoined
    2 finished and unjoined
    0 running and detached
Perl exited with active threads:
    5 running and unjoined
    5 finished and unjoined
    0 running and detached

为什么没有完成所有线程? (unjoined是因为我从未在代码中加入它们,所以它是预期的)

1 个答案:

答案 0 :(得分:1)

你必须加入线程,否则主线程可能(如你的例子中)在其子线程之前完成,

$_->join for @t;

来自perldoc threads

  

$ thr->加入()

     

这将等待相应的线程完成其执行。线程完成后, - > join()将返回入口点函数的返回值。