一个程序,如下功能,多线程同时下载多个图片并保存。
具体的多线程代码片段如下:
use Thread;
......
for my $list (@list){
? print "Download begin./n";
? my $thread = Thread->new(/&DownLoadFunction,$parameters);
? $thread->join();
}
运行这个程序你将发现,程序并没有并发的多线程,同时会出现一些意外情况,这个自己可以试试看,写一些简单的实现去测试并发现错误的类型。
对此,我们加以修改,如下:
use Thread;
......
my @threadlist;
for my $list (@list){
? print "Download begin./n";
? my $thread = Thread->new(/&DownLoadFunction,$parameters);
? push @threadlist,$thread;
}
foreach my $thread (@threadlist){
? $thread->join();
}
运行这个程序,则会按照我们预计的情况并发执行下载任务。
注意:正确的应该是先将所有的thread都放到一个list中,然后对他们进行join。
在Windows中,我们也可以使用fork来进行多线程的执行,与thread有相同的效果,代码如下:
for my $list (@list){
? my $child = fork();
? if($child){
??? # child > 0,so we are the parent
??? print "Download begin./n";
? }else{
??? # child = 0,handle child
??? DownLoadFunction($parameters);
??? exit 0;
? }
}
注意:必须使用exit 0 来推出线程,否则将会出错,具体的代码自己可以完成并测试。