Port eg/threaded.pl to ithreads
chansen [Mon, 26 Sep 2011 11:58:51 +0000 (13:58 +0200)]
perl/eg/threaded.pl

index 09998f1..639b48f 100644 (file)
@@ -1,45 +1,48 @@
 #!/usr/bin/perl
+use strict;
+use warnings;
+use threads;
+use threads::shared;
 
-use FCGI;
-use Thread;
-use IO::Handle;
+use FCGI       qw[];
+use IO::Handle qw[];
 
 use constant THREAD_COUNT => 5;
 
-sub doit {
+my @count : shared = (0, (0) x THREAD_COUNT);
+
+sub worker {
     my $k = shift;
     my %env;
-    my $in = new IO::Handle;
-    my $out = new IO::Handle;
-    my $err = new IO::Handle;
+    my $in  = IO::Handle->new;
+    my $out = IO::Handle->new;
+    my $err = IO::Handle->new;
 
     my $request = FCGI::Request($in, $out, $err, \%env);
 
-    while ($request->Accept() >= 0) {
-       print $out
-           "Content-type: text/html\r\n",
-           "\r\n",
-           "<title>FastCGI Hello! (multi-threaded perl, fcgiapp library)</title>",
-           "<h1>FastCGI Hello! (multi-threaded perl, fcgiapp library)</h1>",
-           "Request counts for ", THREAD_COUNT ," threads ",
-          "running on host <i>$env{SERVER_NAME}</i><P><CODE>";
-
-       {
-           lock(@count);
-
-           ++$count[$k];
-
-           for(my $i = 0; $i < THREAD_COUNT; ++$i) {
-               print $out $count[$i];
-               print $out " ";
-           }
-       }
-       $request->Flush();
-       sleep(1);
+    while ($request->Accept >= 0) {
+        print $out
+               "Content-type: text/html\r\n",
+               "\r\n",
+               "<title>FastCGI Hello! (multi-threaded perl, fcgiapp library)</title>",
+               "<h1>FastCGI Hello! (multi-threaded perl, fcgiapp library)</h1>",
+               "Request counts for ", THREAD_COUNT ," threads ",
+               "running on host <i>$env{SERVER_NAME}</i>";
+
+        {
+            lock(@count);
+
+            ++$count[$k];
+
+            for(my $i = 1; $i <= THREAD_COUNT; $i++) {
+                print $out $count[$i];
+                print $out " ";
+            }
+        }
+        $request->Flush;
+        sleep(1);
     }
 }
 
-for ($t = 1; $t < THREAD_COUNT; ++$t) {
-    new Thread \&doit, $t;
-}
-doit(0);
+$_->join for map { threads->create(\&worker, $_) } 1..THREAD_COUNT;
+