2008年12月24日星期三

perl thread tutorial

perl线程学习指南

http://www.mathematik.uni-ulm.de/help/perl5/doc/perlthrtut.html
perldoc perlthrtut


1:创建线程

use threads;
my $thr = threads->new(\&sub1);

sub sub1{
print "In the threads";
}

也可以通过creat创建线程并为线程传递参数
new=create

my $thr = threads->create(\sub1,@paramlist);


2:等待线程结束

use threads;
my ($thr) = threads->new(\sub1);
my @return = $thr->join();

sub sub1{
return ('FiFty',1,2);
}

注意在这个例子中,sub1返回的是一个list,所以我们需要在定义线程时候使用my ($thr),这是给$thr一个list的上下文

3:忽略一个线程
join做三件事:等待线程推出,清理线程以及返回线程返回值。
如果你对线程没啥兴趣,可以使用detach不管它,perl会自动收拾这个进程

use threads
my $thr = threads->create(\&sub1);

$thr->detach();
sleep(15);

sub sub1{
my $a=0;
while(1){
$a++;
print "\$a is $a\n";
sleep 1;
}
}

sleep在这里的作用是使主进程多运行一些时间,否则主程序推出则线程也会退出

我们也可以在sub里面退出线程

sub sub1{
threads->detach();
}


4:数据共享

use threads;
use threads::shared;

my $foo:shared = 1;
my $bar = 1;

my $thr = threads->create(sub{$foo++;$bar++}->join();
print $foo,"\n"; #2
print $bar,"\n"; #1

使用hash作为共享数据要注意的是

my $foo:shared;
my $bar;
my %foo;

$foo->{bar} = \$bar #错误,必须使用共享数据的引用


5:使用数据共享带来的问题
考虑这样一个程序

use threads;
use threads::shared;

my $a :shared = 1;
my $thr1 = threads->create(\&sub1);
my $thr2 = threads->create(\&sub2);

$thr1->join;
$thr2->join;
print("$a\n");

sub sub1 { my $foo = $a; $a = $foo + 1; }
sub sub2 { my $bar = $a; $a = $bar + 1; }


这时候a的值是多少呢?sub1和sub2都对变亮a进行了修改,所以a的值是不确定的,可能是2也可能是3(我试了n次都是3)

6:同步和控制
访问控制:lock()

没有评论: