免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2720 | 回复: 7
打印 上一主题 下一主题

多线程代码解读求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-15 21:38 |只看该作者 |倒序浏览
  • #!/usr/local/bin/perl   
    use warnings;
    use strict;
    use English '-no_match_vars';
    use Errno qw(EAGAIN);
    use threads;
    use threads::shared;
    my $items = 20;          #需要处理的任务数
    my $maxchild = 65;  #最多线程数(1-65),perl最多允许64个子线程,加上主线程因此最多65个线程
    my $pid;
    my $forks: shared = 1;  #当前线程数
    print "start\n";
    my $item: shared = 0;  #当前处理任务序号,起始序号为0
    my $myid = 1;  #当前线程序号
    my $main_pid = $PID;
    sub subprocess;  #最多$maxchild个线程完成$items项任务
            while ($item<$items) {
                    FORK: {
                             #select undef,undef,undef,0.1;
                            if (($forks<$maxchild) && ($PID == $main_pid)) { #必须只允许主线程产生子线程
                                     if ($pid = fork) { #主线程处理
                                            $| = 1;
                                            $forks++;
                                            $myid++;
                                            print "Starting Sub_Process:($pid/$PID)\n";
                                    }elsif (defined $pid) { #子线程处理
                                            $| = 1;
                                            last unless (subprocess);
                                    }elsif ($! == EAGAIN) { #子线程未创建成功
                                            print "$! !\n";  # EAGAIN is the supposedly recoverable fork error
                                            sleep 5;
                                            redo FORK;
                                    }else { #不能创建子线程  # weird fork error
                                            die "Can't fork: $!\n";
                                    }
                            }else { #所有线程处理
                                    last unless (subprocess);
                            }
                    }
            }
    sub subprocess {  #由于$item是共享的且每个线程都能对其进行修改,  # 因此为了保证当前线程任务序号的正确,必须将$item转入局部变量存储
             my $sid;  #存储线程当前处理任务序号。
            {
                     lock($item);
                    $sid = $item;
                    $item++ if ($item < $items);
            }
             if ($sid < $items) { #任务处理
                    print "Child process($PID/$myid) start :$sid/ !\n";
                    print " n!\n";  
                    ###########加入自己的代码

                    sleep 1;
                    print "Child process($PID/$myid) end :$sid/ !\n";
                    return 1;
            }elsif ($main_pid == $PID) { #主线程结束
                    wait;  #结束前等待所有子线程结束
                    print "Main process $$/$myid end\n";
                    exit 1;
            }else { #子线程结束
                     print "Child process($PID/$myid) exit :$sid/ !\n";
                    exit 1;
            }
    }

论坛徽章:
0
2 [报告]
发表于 2014-10-15 21:45 |只看该作者
sub subprocess;  这句话是定义一个子程序吗?
调用subprocess时并没有带参数,而subprocess里直接使用了主程序的变量$item、$items、$PID、$myid,没有通过参数传递,而不报错。
求大神!

论坛徽章:
0
3 [报告]
发表于 2014-10-15 21:45 |只看该作者
sub subprocess;  这句话是定义一个子程序吗?
调用subprocess时并没有带参数,而subprocess里直接使用了主程序的变量$item、$items、$PID、$myid,没有通过参数传递,而不报错。
求大神!

论坛徽章:
0
4 [报告]
发表于 2014-10-15 21:45 |只看该作者
这是代码的运行结果
---------- perl ----------
start
Starting Sub_Process:(-6620/7640)
Child process(-6620/1) start :0/ !
n!
Starting Sub_Process:(-7368/7640)
Starting Sub_Process:(-7356/7640)
Child process(-7356/3) start :1/ !
n!
Starting Sub_Process:(-7352/7640)
Starting Sub_Process:(-7896/7640)
Child process(-7896/5) start :2/ !
n!
Starting Sub_Process:(-5036/7640)
Child process(-7368/2) start :3/ !
n!
Starting Sub_Process:(-5708/7640)
Starting Sub_Process:(-7276/7640)
Child process(-5708/7) start :4/ !
n!
Child process(-7352/4) start :5/ !
n!
Child process(-5036/6) start :6/ !
n!
Child process(-7276/8) start :7/ !
n!
Starting Sub_Process:(-7120/7640)
Starting Sub_Process:(-6204/7640)
Child process(-7120/9) start :8/ !
n!
Starting Sub_Process:(-960/7640)
Child process(-6204/10) start :9/ !
n!
Child process(-960/11) start :10/ !
n!
Starting Sub_Process:(-5928/7640)
Child process(-5928/12) start :11/ !
n!
Starting Sub_Process:(-6540/7640)
Child process(-6540/13) start :12/ !
n!
Starting Sub_Process:(-6568/7640)
Child process(-6568/14) start :13/ !
n!
Starting Sub_Process:(-7404/7640)
Child process(-7404/15) start :14/ !
n!
Starting Sub_Process:(-6232/7640)
Child process(-6232/16) start :15/ !
n!
Starting Sub_Process:(-5856/7640)
Child process(-5856/17) start :16/ !
n!
Starting Sub_Process:(-6756/7640)
Child process(-6756/18) start :17/ !
n!
Starting Sub_Process:(-2060/7640)
Child process(-2060/19) start :18/ !
n!
Starting Sub_Process:(-8052/7640)
Child process(-8052/20) start :19/ !
n!
Starting Sub_Process:(-7292/7640)
Child process(-7292/21) exit :20/ !
Child process(-6620/1) end :0/ !
Child process(-7356/3) end :1/ !
Child process(-7896/5) end :2/ !
Child process(-7368/2) end :3/ !
Child process(-7352/4) end :5/ !
Child process(-5708/7) end :4/ !
Child process(-5036/6) end :6/ !
Child process(-7276/8) end :7/ !
Child process(-7120/9) end :8/ !
Child process(-6204/10) end :9/ !
Child process(-960/11) end :10/ !
Child process(-5928/12) end :11/ !
Child process(-6540/13) end :12/ !
Child process(-6568/14) end :13/ !
Child process(-6232/16) end :15/ !
Child process(-7404/15) end :14/ !
Child process(-5856/17) end :16/ !
Child process(-6756/18) end :17/ !
Child process(-2060/19) end :18/ !
Child process(-8052/20) end :19/ !

输出完毕 (耗时 1 秒) - 正常终止

论坛徽章:
30
水瓶座
日期:2014-08-22 21:06:3415-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:4715-16赛季CBA联赛之天津
日期:2019-01-11 01:11:44
5 [报告]
发表于 2014-10-16 12:11 |只看该作者
jzp520520 发表于 2014-10-15 21:45
sub subprocess;  这句话是定义一个子程序吗?
调用subprocess时并没有带参数,而subprocess里直接使用了主 ...

1. 是的
2. 直接引用的是全局变量

论坛徽章:
0
6 [报告]
发表于 2014-10-16 20:27 |只看该作者
回复 5# shijiang1130


    请问,怎样才能在定义子程序时,实现直接引用全局变量,我在模仿这个写法的时候 就会报错。

论坛徽章:
30
水瓶座
日期:2014-08-22 21:06:3415-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:4715-16赛季CBA联赛之天津
日期:2019-01-11 01:11:44
7 [报告]
发表于 2014-10-17 09:07 |只看该作者
jzp520520 发表于 2014-10-16 20:27
回复 5# shijiang1130
现在的问题是我没有坐在你电脑前面,不知道报的什么错

论坛徽章:
0
8 [报告]
发表于 2014-10-17 15:40 |只看该作者
$|=1  想知道有什么作用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP