2010-09-19 54 views
2

我正在使用Thread::Pool::Simple进行多线程。 我有几个问题,这是相当笼统的多线程,我猜:如何使用Perl的`Thread :: Pool :: Simple`?

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

Perl exited with active threads: 
    0 running and unjoined 
    0 finished and unjoined 
    4 running and detached 
  1. 这些“运行和超然” 僵尸?他们在任何 的方式是否“危险”?如果任何线程死亡,有没有办法杀死它们的所有 ? 这种 方案的常见解决方案是什么?
  2. 一般来说,我的工作是独立的。 但是,我将它们中的每一个作为 参数传递一个独特的散列,它是 从一个大散列哈希哈希。 该线程可能会更改此 个人散列(但它不能得到 大散列 - 它甚至不知道 知道它)。因此,我想我 不需要任何锁等。我是否 缺少什么?

回答

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个线程已经分离,但在程序死亡之前还没有完成。如果程序运行时间较长,或者它们陷入无限循环,或者死锁,或者是什么,你无法判断它们是否会完成。

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

+0

重新锁定 - 以及如果我将大散列和关键字一起传递,并且线程仅使用由该关键字指向的内部散列,该怎么办? – 2010-09-20 11:03:32

+0

问题问'Thread :: Pool :: Simple',但这个答案不使用这个模块。 – CJ7 2016-12-04 23:40:25

+0

@ CJ7,答案不使用'Thread :: Pool :: Simple',因为它不是特定于该模块的。他询问的消息是由Thread Thread :: Pool :: Simple构建的核心'threads'模块生成的。 – cjm 2016-12-05 05:50:59

相关问题