线程加入问题

时间:2011-09-05 14:33:27

标签: linux multithreading perl

我在Linux机器上使用Perl并且我的内存使用率正在上升,我相信因为之前运行的线程尚未被杀死/加入。 我想我需要以某种方式发信号通知已完成/运行终止的线程,然后分离 它/他们将自动清理它给我回忆......

我试过return(); with $ thr_List-> join(); &安培; $ thr_List->分离();但是我的gui并没有显示加入的年龄,并且mem问题似乎 与分离在一起...任何帮助...

$mw->repeat(100, sub { # shared var handler/pivoting-point !?

while (defined(my $command = $q->dequeue_nb())) { #???
# to update a statusbar's text
        $text->delete('0.0', "end");
        $text->insert('0.0', $command);
  $indicatorbar->value($val); # to update a ProgressBar's value to $val
  $mw->update();

    for ( @threadids ) { # @threadids is a shared array containing thread ids
    # that is to say I have got the info I wanted from a thread and pushed its id into the above @threadids array. 
    print "I want to now kill or join the thread with id:  $_\n";
        #$thrWithId->detach();
        #$thrWithId->join();
    # then delete that id from the array 
    # delete $threadids[elWithThatIdInIt];


    # as this seems to be in a repeat(100, sub... too, there are problems??!
    # locks maybe?!? 
    # for ( @threadids ) if its not empty?!?
        }
   } # end of while
}); # end of sub

# Some worker... that works with the above handler/piviot me thinks#???
async {
   for (;;) {
 sleep(0.1);
 $q->enqueue($StatusLabel);
   }
 }->detach();

如果需要,我已经在这里上传了我的完整代码(http://cid-99cdb89630050fff.office.live.com/browse.aspx/.Public),它在Boxy.zip中...


首先很抱歉在这里回复,但我丢失了我的cookie,允许编辑等...

非常感谢gangabass,看起来很棒的信息,我将不得不花一些时间在它上面,但至少看起来其他人都在问同样的问题......我担心我总是弄得一团糟的东西。

谢谢你们......

2 个答案:

答案 0 :(得分:1)

所以听起来你加入了工作,但速度很慢?

perl中的线程不是轻量级的。创建和连接线程需要大量的内存和时间。 如果您的任务允许,最好保持线程运行并为其提供额外的工作,而不是结束它们并在以后启动新线程。 Thread::Queue可以为此提供帮助。也就是说,除非你在Windows上,否则没有太多意义,而不是分叉和使用Parallel::ForkManager

答案 1 :(得分:0)

您需要仅使用一个工作线程并从中更新GUI 。其他线程只处理队列中的数据,不需要终止它们。

有关详细信息,请参阅this示例