Chinaunix首页 | 论坛 | 博客
  • 博客访问: 583760
  • 博文数量: 69
  • 博客积分: 2204
  • 博客等级: 大尉
  • 技术积分: 808
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-11 22:37
个人简介

..微笑着看着杯中的花茶一片片撑开.. ..透明的花瓣里水破开的声音很轻微..

文章分类

全部博文(69)

文章存档

2018年(1)

2017年(2)

2016年(10)

2015年(8)

2014年(6)

2013年(6)

2012年(4)

2011年(8)

2010年(12)

2009年(12)

分类:

2009-11-14 21:24:30

      在perl里面等待没有detach的线程好说,直接join等待退出就可以了。但是对于被detach过的,就比较麻烦一点了。因为主函数退出的时候是不管被detach了的线程是否完成的,没有完成就强制杀死,可能会导致程序工作结果不对。可是detach线程又是不可避免的,我尤其喜欢这么做,主要原因是因为我懒,不想保存一个数组,然后去挨个儿去收割,麻烦啊。况且detach掉之后,线程结束时系统自动回收资源,更是美事一桩。

      今天测试一个小程序的时候,想到既然一般使用信号量来控制并发线程数量,那么应该也可以用信号量作为事件,来等待线程结束啊。写了个脚本测试一下,确实可行。在所有线程创建完毕,主程序要退出之前,尝试获得最大线程数量个信号,无法获得的时候会阻塞,直到成功获得。这是因为一共创建了最大并发线程数个信号量,而一个线程占用一个信号量,线程退出的时候才释放。如果能够获得到原始个数,就表示所有线程都释放了,所有线程处理完毕,程序可以结束了。
 
 

#!/usr/bin/perl

use strict;
use warnings;
use threads;
use Thread::Semaphore;
 
my $max_thread = 4;
my $semaphore = new Thread::Semaphore( $max_thread );
 
sub TestFun
{
    my $num = shift;
    my $count = 1;
    while( $count <= 3 )
    {
        print "print $num $count times in thread ".threads->self()->tid()."\n";
        sleep( 1 );
        $count ++;
    }
    # 线程技术,释放一个信号量

    $semaphore->up( );
}
 
sub Wait2Quit
{
    print "Waiting to quit...\n";
 
    my $num = 0;
    while( $num < $max_thread )
    {
        # 尝试获取信号量,当能够获取到最大线程数个信号量时,表示所有线程都结束了

        $semaphore->down( );
        $num ++;
        print "$num thread quit.\n";
    }
    print "All $max_thread thread quit.\n";
}
 
for( my $index = 1; $index <= 10; $index ++)
{
    # 获取一个信号量,控制并行的线程数量

    $semaphore->down( );
    my $thread = threads->create( \&TestFun, $index );
 
    # 剥离线程,不关心返回值,系统自动回收资源

    $thread->detach();
}
 
Wait2Quit( );


转自 云舒心路

阅读(1394) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~