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()

没有评论:
发表评论