Perl threads 摘要

Perl threads 摘要最近又写了一个多线程的小工具 对一些多线程的使用有了进一步的心得 Perl 创建线程有两种方式 正常通过 threads create 创建线程 用 async nbsp 创建一个调用匿名过程的线程 具体参考 perldocthrea 线程共享变量需要使用 threads shared 共享变量只能存储 scalar 共享变量的引用 如果存储 ListHash 的引用需使用 shared clo

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

  • 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..); #使用一个大的变量观察内存使用情况 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.

仅供参考,欢迎指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233674.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MIPI协议简介

    MIPI协议简介MIPI协议简介 介绍 MIPI联盟定义了一套接口标准,把移动设备内部的接口如摄像头、显示屏、基带、射频接口等标准化,从而增加设计灵活性,同时降低成本、设计复杂度、功耗和EMI。未来的产品都将朝着移动的方向发展,例如智能手机、数码相机、摄像机、平板电脑、媒体播放器、游戏机等,这些产品需要能执行多任务,包括处理多个不同的传感器如麦克风、图像传感器、磁罗盘、三轴加速度计和精细的触摸屏…

    2022年4月28日
    60
  • WPF获取窗口句柄

    WPF获取窗口句柄2019独角兽企业重金招聘Python工程师标准>>>…

    2022年7月21日
    11
  • springmvc笔记_SpringMVC优点

    springmvc笔记_SpringMVC优点MVC简介普通的web项目每次都要进行手动的把jar包导进去,否则会报500,classnotfound[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VstjHhuz-1609824493673)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210104132339761.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9AgS48A-16

    2022年10月15日
    2
  • QListWidget的使用

    QListWidget的使用QListWidgetQListWidget类提供了一个基于item的列表小部件。QListWidget是一个方便的类,它提供了类似于QlistView所具有的列表视图,但是具有增加和删除的功能。QListWidget使用内部模型来管理列表中的每个QListWidgetItem。想要有更灵活的列表视图,请使用具有标准模型的QListView类。QlistWidget有两种方法追加数据,一种

    2022年5月3日
    77
  • C/C++产生随机数

    C/C++产生随机数

    2021年12月15日
    58
  • python中的缩进规则_什么叫代码缩进

    python中的缩进规则_什么叫代码缩进引言python对缩进是敏感的,而大多教程对缩进规则,往往就几句话带过,对于没有其他语言基础的初学者,十分不友好,本文就把python常见的缩进问题做了一些整理。一、Python缩进长度及缩进字符常看到一些Python缩进错误的解读,“tab符和空格做为缩进不能混用”、“缩进一定是4个空格”。实际上并没有这些限制,例如图中的示例就可以正常运行。a=1ifa==1:print(a)else:print(1)k=1;whilek<5:

    2022年10月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号