Perl threads 摘要

最近又写了一个多线程的小工具,对一些多线程的使用有了进一步的心得。

  • Perl 创建线程有两种方式,正常通过threads->create 创建线程,用async  创建一个调用匿名过程的线程,具体参考perldoc threads。
  • 线程共享变量需要使用 threads::shared,共享变量只能存储scalar,共享变量的引用,如果存储List Hash的引用需使用shared_clone([@list]) shared_clone({%hash})。
  • 线程创建后最好join 或者detach,否则在退出时会有warning。
  • 线程的join 方式,使用threads 中提供的函数接口,可以做到及时释放资源,参考下边的例子
use strict;
use warnings;
use threads;
use Data::Dumper;
$|=1;

sub test{
    my $i = shift;
    my @x = (1..999999); #使用一个大的变量观察内存使用情况
    sleep 2*$i;
    printf "%s run to the end.\n", threads->tid();
}

for (reverse (0..10)){
    threads->create(\&test,$_);
}

my $monitor = async { #用来观察子线程状态
    sleep 1;
    while(1){
        for(threads->list()){
            printf "%s join? %s\n", $_->tid(), $_->is_joinable() ? 'true' : 'false';
        }
        sleep 2;
    }
};
$monitor->detach();

#方法1
$_->join() for threads->list()

#方法2
#~ while(threads->list()){
    #~ $_->join() for threads->list(threads::joinable);
#~ }
使用方法1 的结果,最先产生的线程耗时最长,按此法join 会按顺序释放资源,后来的线程虽已结束,但仍然等待前者结束然后才能释放自己的资源,前者结束前资源一直被占用。运行此脚本过程中打开任务管理器,观察内存使用情况,可以看到脚本结束前资源一直占用最大,没有释放过。
4 run to the end.
2 join? false
3 join? false
4 join? true
3 run to the end.
2 join? false
3 join? true
4 join? true
2 run to the end.
2 join? true
3 join? true
4 join? true
1 run to the end.
使用方法2的结果,只join 已经完成的线程,资源会被及时释放。观察内存的使用情况,可以看到资源逐步递减,并没有被一直占用。
4 run to the end.
1 join? false
2 join? false
3 join? false
3 run to the end.
1 join? false
2 join? false
2 run to the end.
1 join? false
1 run to the end.

仅供参考,欢迎指正。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值