0

我是 Perl 的新手,我正在编写一个需要使用线程的程序。我在 Perl 中找到了线程功能,但我发现我仍然有点困惑。正如这篇文章的标题所述,Java 可能是最常用的线程。我并不是说它是完美的,但我可以使用Thread类完成工作。

在 Java 中,我有一个名为 startThreads 的方法,在该方法中我创建了线程,然后启动了它们。启动它们后,有一个 while 循环正在检查踏板是否完成。如果所有线程都已正确退出,则 while 循环退出,但如果没有,则 while 循环正在监视哪些线程已超时,然后安全地中断这些线程并将其关闭标志设置为 true。

问题:在 Perl 中,我想使用与上面所述相同的算法,但是 Perl 中当然存在差异,而且我是 Perl 的新手。是否可以在其他线程运行时运行 while 循环?它是如何完成的?

4

3 回答 3

2

您可以while使用 Perl 来实现您的循环,threads->list()但您应该首先考虑一种不同的方法。

与其等待线程,不如等待结果?

这里的基本思想是,您的代码从队列中获取工作单元,并将工作单元的结果(对象或异常)放入输出队列。

启动几个线程等待输入队列中的工作单元。当一个出现时,运行工作单元并将结果放入输出队列。

在您的主代码中,您只需将所有 N 个工作单元放入输入队列(确保它足够大)。之后,您可以在输出队列中等待 N 个输出,您就完成了,无需担心线程、连接和异常。

[编辑]你所有的问题都应该在http://perldoc.perl.org/perlthrtut.html中回答

于 2012-04-30T09:10:14.367 回答
1

在 perl 中使用线程时要小心。关于安全访问共享数据有很多细微差别。因为大多数 Perl 代码不执行线程,所以很少有模块是线程安全的。

于 2012-05-01T17:11:26.883 回答
0

在阅读了 Michael Slade 提供的链接后,我发现 Cyber​​-Guard Enterprise 是正确的。通过分离线程,主线程仍在执行工作。我尚未对其进行测试,但看起来 $thr->is_running() 可以告诉我线程是否仍在运行。

这是从提供的 url 中获取的,并显示了如何使用 detach。perldoc.perl.org/perlthrtut.html?

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 {
$a = 0;
while (1) {
$a++;
print("\$a is $a\n");
sleep(1);
}
}
于 2012-05-01T05:43:39.183 回答