Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2454232
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类:

2011-04-01 09:48:24



在使用perl多线程时,在每次创建子线程的时候都会报出:Scalars leaked: 1
比如如下代码:

#!/usr/bin/perl -w
use threads ;
use threads::shared;

my %h = (
’1′=>’a',
’2′=>’b',
’3′=>’c',
);

&main(\%h);

sub main {
     my ($in) = @_;
     foreach my $i (0..4){
           threads->new ( \&sub_func, $in );
     }

     threads->list()->join();
}
sub sub_func{
     my ($arg1) = @_;
     print “$arg1->{1} —”;
     print threads->self->tid;
     print “\n”;
}


运行输出:

perl leak2.pl
a ----1
a ----2
a ----3
a ----4
a ----5
Scalars leaked: 1

原因:

在main函数中,在threads->new之前,使用了my ($in) = @_这句赋值语句造成的。
看来造成scalars leak的原因是魔法@_引起的,可能是@_的含义太多了的缘故吧,也可能是perl threads模块的bug


解决办法:

  1. 替换为:my $in = shift;
  2. 在每一行my (@args) = @_;下面加一个@_ = ( );


阅读(1965) | 评论(0) | 转发(0) |
0

上一篇:系统状态查看

下一篇:sed 用法

给主人留下些什么吧!~~