免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Perl_Er

关于perl的多线程&多进程的问题 [复制链接]

论坛徽章:
0
发表于 2009-07-02 07:59 |显示全部楼层
原帖由 MMMIX 于 2009-7-1 23:32 发表

干嘛要这么做?
  1. sub start_thread {
  2.         print "Thread ", threads->tid(), " started, current thread numbers $_[0]\n";
  3.         {
  4.                 sleep 2;
  5.                                 lock($thread_num);
  6.                 $thread_num--;
  7.                                 cond_signal($thread_num);
  8.         }
  9. }
复制代码


在正常的code里面sleep 2这个地方在执行一些别的代码。我应该把代码加到lock前面。

论坛徽章:
0
发表于 2009-07-02 08:06 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. use threads;
  5. use Thread::Semaphore;

  6. my $thread_num = Thread::Semaphore->new(10);

  7. sub start_thread {
  8.         print "Thread ", threads->tid(), " started\n";
  9.         $thread_num->up();
  10. }

  11. for (1 .. 200) {
  12.         $thread_num->down();
  13.         if (my $t = threads->create(\&start_thread)) {
  14.                 $t->detach();
  15.         }
  16. }
复制代码


你这个up和down是不是反了?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-07-02 09:09 |显示全部楼层
原帖由 Perl_Er 于 2009-7-2 07:59 发表

在正常的code里面sleep 2这个地方在执行一些别的代码。我应该把代码加到lock前面。

你应该把你的代码放在

# put your code HERE ...
{
    lock($thread_num);
    ...
}

前面,而不是 lock 的前面。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-07-02 09:10 |显示全部楼层
原帖由 Perl_Er 于 2009-7-2 08:06 发表
你这个up和down是不是反了?

不是。

论坛徽章:
0
发表于 2009-07-02 09:41 |显示全部楼层

回复 #54 MMMIX 的帖子

是不是在初始化的时候是10,然后每起一个就down 1, down到小于0就block等待,是不是这个意思?


  1.         if (my $t = threads->create(\&start_thread)) {
  2.                 $t->detach();
  3.         $thread_num->down();  应该在这里吧!
  4.         }
复制代码

[ 本帖最后由 Perl_Er 于 2009-7-2 10:13 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-07-02 10:38 |显示全部楼层
原帖由 Perl_Er 于 2009-7-2 09:41 发表

是不是在初始化的时候是10,然后每起一个就down 1, down到小于0就block等待,是不是这个意思?

没错。

        if (my $t = threads->create(\&start_thread)) {
                $t->detach();
        $thread_num->down();  应该在这里吧!

不应该。

在这里,semaphore $thread_num 相当于一个资源计数器,用来计数当前还能创建多少个线程,down() 用来申请该资源,up() 用来释放。每创建一个线程,就需要消耗一个 $thread_num 计数的资源,因此要在 threads->create() 之前执行 down()。在 start_thread 的最后执行 up() 道理是类似的。

论坛徽章:
0
发表于 2009-07-02 11:08 |显示全部楼层

回复 #56 MMMIX 的帖子

如果my $t = threads->create(\&start_thread)失败了了?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-07-02 11:14 |显示全部楼层
原帖由 Perl_Er 于 2009-7-2 11:08 发表
如果my $t = threads->create(\&start_thread)失败了了?

要么 up() 要么循环直到 create() 成功。

论坛徽章:
0
发表于 2009-07-02 13:44 |显示全部楼层
改了一下,加了一个redo
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. use threads;
  5. use Thread::Semaphore;

  6. my $thread_num = Thread::Semaphore->new(10);

  7. sub start_thread {
  8.    print "Thread ", threads->tid(), " started\n";
  9.    $thread_num->up();
  10. }

  11. for (1 .. 200) {
  12.    $thread_num->down(); #我觉得这个down还是要放到if里面,如果create失败的话,这个down是执行了的并且减去了1,但是没有一个对应的up来加1. 如果连续10个create都失败的话,就会一直hold
  13.    if (my $t = threads->create(\&start_thread)) {
  14.    $t->detach();
  15. }else{
  16.    redo;
  17. }
  18. }

  19. sleep(2);
复制代码

[ 本帖最后由 Perl_Er 于 2009-7-2 14:02 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-07-02 14:01 |显示全部楼层
原帖由 Perl_Er 于 2009-7-2 13:44 发表
改了一下,加了一个redo

给了你两种正确的解决方案,结果呢,你偏偏想出来个错误的第三种。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP