免费注册 查看新帖 |

Chinaunix

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

请perl高手帮我看看,为什么偶滴代码中 Semaphore 没有起作用呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-04 21:59 |只看该作者 |倒序浏览
本帖最后由 kelvenchi 于 2013-05-04 22:01 编辑
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use threads;
  5. use threads::shared;
  6. use Socket;
  7. use Thread::Semaphore;
  8. use Thread::Queue;

  9. if (my $pid = fork) {
  10.     exit;
  11. } elsif ($pid = fork) {
  12.     setpgrp;
  13.     exit;
  14. } else {

  15.     my $fd    = Thread::Queue->new();
  16.     my $rabbish = Thread::Queue->new();
  17.     my $sem = shared_clone(Thread::Semaphore->new(5));
  18.     my $lis = threads->create(\&boss);
  19.     my $jt = threads->create(\&joinThread);

  20.     sub worker {
  21.         my $fino = $fd->dequeue;
  22.         while (1) {
  23.         my @in;
  24.         open my $fhh, "<tserver.pl" or die "$!";
  25.         @in = <$fhh>;
  26.         close $fhh or die "$!";
  27.         open my $fh, ">&=$fino" or die "$!";
  28.         while (@in) {
  29.             my $single = shift @in;
  30.             print $fh "$single";
  31.         }
  32.         print $fh "this message is from the server $ and the tid is " . threads->self->tid . "\n";
  33.         close $fh or die "$!";
  34.         }
  35.     }

  36.     sub joinThread {
  37.         while (my $j = $rabbish->dequeue()) {
  38.             $j->detach;
  39.             $sem->up;
  40.         }
  41.     }

  42.     sub boss {
  43.         socket Server, AF_INET, SOCK_STREAM, getprotobyname 'tcp';
  44.         setsockopt Server, SOL_SOCKET, SO_REUSEADDR, 1;
  45.         my $paddr = sockaddr_in 9001, INADDR_ANY;
  46.         bind Server, $paddr;
  47.         listen Server, SOMAXCONN;
  48.         while (accept my $Client , Server) {
  49.             my $t;
  50.             $t = threads->create(\&worker) if $sem->down_nb();
  51.             $rabbish->enqueue($t) if $t;
  52.             $fd->enqueue(fileno $Client)if $t;
  53.             undef $t;
  54.             close $Client;
  55.         }
  56.     }
  57.     $lis->join;
  58.     $jt->join;
  59. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP