我正在使用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是因为我从未在代码中加入它们,所以它是预期的)
答案 0 :(得分:1)
你必须加入线程,否则主线程可能(如你的例子中)在其子线程之前完成,
$_->join for @t;
$ thr->加入()
这将等待相应的线程完成其执行。线程完成后, - > join()将返回入口点函数的返回值。