近期评论

Archive for 十月, 2013

perl调用多线程

多线程技术发展至今根据模型分有两种,5005threads,ithread;系统安装的perl不管什么版本都不能同时支持两种模型,只能是其中一种。

查看当前版本的perl支持哪个模型,用下面这条shell语句:

perl -V|grep usethreads

输出结果最后一句如下:

usethreads=define use5005threads=undef useithreads=define usemultiplicity=define

表示当前perl版本支持ithreads模型多线程,不支持5005threads

 

根据调用模块版本分也有两种:Thread是旧版本,threads是新版本,目前较常用threads。

threads默认情况下,变量不能共享,如果要使用共享变量,必须在创建线程之前指定某个变量是共享变量。

#=============================================================

#!/usr/bin/perl

use threads;

use threads::shared;

 

my $num :shared;

my $thread_num = 300;

my $for_num = 50;

my @thread;

 

for(1 .. $thread_num) {

$thread[$_] = threads->create(\&hello,$for_num);

}

 

for(1 .. $thread_num) {

$thread[$_]->join;

}

 

sub hello {

my ($loop) = @_;

for(1..$loop) {

#               lock($num);

$num+= 1;

#               my $thread_self = threads->self;

#               my $tid = $thread_self->tid;

#               print "^^^^^^^^^\$tid is $tid\n";

#               sleep 1;

}

}

 

print "the var is $num\n";

#=============================================================

注意:

  • 定义共享变量my $num:shared=0;这句必须在创建线程之前执行,在后面指定无效;

 

2、如果不锁定变量,设置了共享变量不起作用,并且必须在修改变量之前锁定,这样只有启用了锁定变量的线程才能修改该变量的值,其他线程运行到这里时开始阻塞,等待锁定变量的线程执行完毕;

 

3、不锁定变量,使用共享变量运行多线程,经测试大约有10%的概率出现不准确的结果。并且不准确的结果不一定相同。

这一点可以确定跟线程内部循环语句循环次数有关系,当循环次数达到上千次时就报错概率大大提高;

不确定跟线程数量没有关系。由于一个线程具体占用多少内存跟代码内容有关,但是linux系统默认最大线程数是8192个,通过下面这条命令查看:

cat /proc/sys/kernel/threads-max

 

  • 捕获参数my ($loop) = @_;不能用$_代理@_

 

  • 函数join表示合并线程到进程,并等待线程执行完毕后,回收资源。