微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl 程序在做多线程时async使用一定要谨慎

      使用Perl开发Linux和Unix维护管理脚本是常用的手段,其中也会因为作业要求大量使用多线程技术。通常下我们使用threads::create()创建一个新的线程,这时候往往我们会创建一个$thr来保存线程ID,并在程序结束后由threads回收线程资源。但是threads还提供了一个叫做async的函数,这个函数提供程序块(BLOCK)的方式创建匿名线程。这个函数帮助我们解决多线程中的同步问题。例如我们在多线程中使用print方法时会发现,我们的print结果没有及时的回显到屏幕上,那么这个函数将帮我解决这个问题。

 

      但是在使用async函数时一定要小心,那就是函数并不会在BLOCK块执行完成后释放匿名线程资源,这将会直接导致内存溢出的严重后果。

当async函数导致内存溢出后,无法再创建新的匿名线程时,会出现这样的错误警告:

Thread creation Failed: pthread_create returned 12 at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/threads.pm line 117.

并且我们使用ps 命令可以看到(红色字体描述的是内存使用量):

root      9332  1.0 87.0 3129776 222236 ?      Ssl  18:18   0:11

这样的信息。

我们应该在代码中使用$thr变量来保存这个匿名线程对象,并在使用完成后手动结束和释放掉该线程资源。或在BLOCK代码块的}后使用->exit()来让该线程自己结束掉,这时perl才会去释放async匿名线程的资源。

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

相关推荐