我如何使用Perl的`Thread :: Pool :: Simple`?

时间:2010-09-19 07:08:18

标签: multithreading perl thread-safety

我正在使用Thread::Pool::Simple进行多线程处理。 我想有几个问题对于多线程非常普遍,我想:

如果出现意外情况,我的每个线程都可能会死亡。这完全被我接受,因为这意味着我的一些断言是错误的,我需要重新设计代码。目前,当任何线程死亡时,主程序(调用线程)也会死亡,产生类似的东西:

Perl exited with active threads:
    0 running and unjoined
    0 finished and unjoined
    4 running and detached
  1. 这些是“跑步和分离” 僵尸?它们是否“危险” 办法?有没有办法杀死所有人 如果任何线程死了? 对此有什么共同的解决方案 场景?
  2. 一般来说,我的工作是独立的。 但是,我把它们作为一个传递给了他们 参数是一个唯一的哈希值 采取一个大哈希哦哈希。 线程可能会改变这一点 个人哈希(但它无法达到 大哈希 - 它甚至没有 了解它)。因此,我猜我 我不需要任何锁等 遗失了什么?

1 个答案:

答案 0 :(得分:0)

当主程序退出时,所有线程都会被终止。

Perl线程以两种方式之一工作。

1)您可以使用join

my $thr = threads->create(...);
# do something else while thread works
my $return = $thr->join(); # wait for thread to terminate and fetch return value

2)您可以使用detach

my $thr = threads->create(...);
$thr->detatch(); # thread will discard return value and auto-cleanup when done

该消息列出了在程序终止之前尚未清除的线程。 “正在运行和未连接”是案例1,仍在运行。 “已完成和未加入”是案例1,已完成但尚未获取返回值。 “运行和分离”是案例2,仍在运行。

所以它说有4个线程已被分离但在程序死亡之前尚未完成。如果程序运行时间更长,或者它们陷入无限循环,或者陷入僵局,或是什么,你无法判断它们是否会完成。

对于您描述的情况,您不需要任何锁定。