This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline
[perl5.git] / pod / perlthrtut.pod
index 2fb09c9..10a7c39 100644 (file)
@@ -5,12 +5,15 @@ perlthrtut - tutorial on threads in Perl
 =head1 DESCRIPTION
 
 B<NOTE>: this tutorial describes the new Perl threading flavour
-introduced in Perl 5.6.0 called interpreter threads, or ithreads
-for short.  There is another older Perl threading flavour called
-the 5.005 model, unsurprisingly for 5.005 versions of Perl.
-The old model is deprecated, and will probably be removed around release
-5.10. You are strongly encouraged to migrate any existing 5.005 threads
-code to the new model as soon as possible.
+introduced in Perl 5.6.0 called interpreter threads, or B<ithreads>
+for short.  In this model each thread runs in its own Perl interpreter,
+and any data sharing between threads must be explicit.
+
+There is another older Perl threading flavour called the 5.005 model,
+unsurprisingly for 5.005 versions of Perl.  The old model is known to
+have problems, deprecated, and will probably be removed around release
+5.10. You are strongly encouraged to migrate any existing 5.005
+threads code to the new model as soon as possible.
 
 You can see which (or neither) threading flavour you have by
 running C<perl -V> and looking at the C<Platform> section.
@@ -197,6 +200,8 @@ However it is important to remember that Perl threads cannot magically
 do things unless your operating systems threads allows it. So if your
 system blocks the entire process on sleep(), Perl usually will as well.
 
+Perl Threads Are Different.
+
 =head1 Threadsafe Modules
 
 The addition of threads has changed Perl's internals 
@@ -220,7 +225,9 @@ environment.
 If you're using a module that's not thread-safe for some reason, you
 can protect yourself by using semaphores and lots of programming
 discipline to control access to the module.  Semaphores are covered
-later in the article.  Perl Threads Are Different
+later in the article.
+
+See also L</"Threadsafety of System Libraries">.
 
 =head1 Thread Basics
 
@@ -241,7 +248,7 @@ Your programs can use the Config module to check whether threads are
 enabled. If your program can't run without them, you can say something
 like:
 
-  $Config{useithreads} or die "Recompile Perl with threads to run this program.";
+    $Config{useithreads} or die "Recompile Perl with threads to run this program.";
 
 A possibly-threaded program using a possibly-threaded module might
 have code like this:
@@ -249,13 +256,15 @@ have code like this:
     use Config; 
     use MyMod; 
 
-    if ($Config{useithreads}) { 
-        # We have threads 
-        require MyMod_threaded; 
-        import MyMod_threaded; 
-    } else { 
-        require MyMod_unthreaded; 
-        import MyMod_unthreaded; 
+    BEGIN {
+        if ($Config{useithreads}) { 
+            # We have threads 
+            require MyMod_threaded; 
+           import MyMod_threaded; 
+        } else { 
+           require MyMod_unthreaded; 
+           import MyMod_unthreaded; 
+        }
     } 
 
 Since code that runs both with and without threads is usually pretty
@@ -263,6 +272,17 @@ messy, it's best to isolate the thread-specific code in its own
 module.  In our example above, that's what MyMod_threaded is, and it's
 only imported if we're running on a threaded Perl.
 
+=head2 A Note about the Examples
+
+Although thread support is considered to be stable, there are still a number
+of quirks that may startle you when you try out any of the examples below.
+In a real situation, care should be taken that all threads are finished
+executing before the program exits.  That care has B<not> been taken in these
+examples in the interest of simplicity.  Running these examples "as is" will
+produce error messages, usually caused by the fact that there are still
+threads running when the program exits.  You should not be alarmed by this.
+Future versions of Perl may fix this problem.
+
 =head2 Creating Threads
 
 The L<threads> package provides the tools you need to create new
@@ -293,7 +313,7 @@ part of the C<threads::new> call, like this:
     $Param3 = "foo"; 
     $thr = threads->new(\&sub1, "Param 1", "Param 2", $Param3); 
     $thr = threads->new(\&sub1, @ParamList); 
-    $thr = threads->new(\&sub1, qw(Param1 Param2 $Param3));
+    $thr = threads->new(\&sub1, qw(Param1 Param2 Param3));
 
     sub sub1 { 
         my @InboundParameters = @_; 
@@ -307,7 +327,7 @@ off several threads using the same subroutine.  Each thread executes
 the same subroutine, but in a separate thread with a separate
 environment and potentially separate arguments.
 
-C<create()> is a synonym for C<new()>
+C<create()> is a synonym for C<new()>.
 
 =head2 Giving up control
 
@@ -322,12 +342,12 @@ Perl's threading package provides the yield() function that does
 this. yield() is pretty straightforward, and works like this:
 
     use threads; 
-       
+
     sub loop {
            my $thread = shift;
            my $foo = 50;
            while($foo--) { print "in thread $thread\n" }
-           threads->yield();
+           threads->yield;
            $foo = 50;
            while($foo--) { print "in thread $thread\n" }
     }
@@ -335,7 +355,7 @@ this. yield() is pretty straightforward, and works like this:
     my $thread1 = threads->new(\&loop, 'first');
     my $thread2 = threads->new(\&loop, 'second');
     my $thread3 = threads->new(\&loop, 'third');
-       
+
 It is important to remember that yield() is only a hint to give up the CPU,
 it depends on your hardware, OS and threading libraries what actually happens.
 Therefore it is important to note that one should not build the scheduling of 
@@ -393,7 +413,6 @@ automatically.
         } 
     }
 
-
 Once a thread is detached, it may not be joined, and any return data
 that it might have produced (if it was done and waiting for a join) is
 lost.
@@ -425,7 +444,7 @@ L<threads::shared> module and the C< : shared> attribute:
     my $foo : shared = 1;
     my $bar = 1;
     threads->new(sub { $foo++; $bar++ })->join;
-    
+
     print "$foo\n";  #prints 2 since $foo is shared
     print "$bar\n";  #prints 1 since $bar is not shared
 
@@ -433,7 +452,7 @@ In the case of a shared array, all the array's elements are shared, and for
 a shared hash, all the keys and values are shared. This places
 restrictions on what may be assigned to shared array and hash elements: only
 simple values or references to shared variables are allowed - this is
-so that a private variable can't accidently become shared. A bad
+so that a private variable can't accidentally become shared. A bad
 assignment will cause the thread to die. For example:
 
     use threads;
@@ -494,8 +513,8 @@ possibility of error:
     my $c : shared;
     my $thr1 = threads->create(sub { $b = $a; $a = $b + 1; }); 
     my $thr2 = threads->create(sub { $c = $a; $a = $c + 1; });
-    $thr1->join();
-    $thr2->join();
+    $thr1->join;
+    $thr2->join;
 
 Two threads both access $a.  Each thread can potentially be interrupted
 at any point, or be executed in any order.  At the end, $a could be 3
@@ -508,13 +527,13 @@ by other threads, you must take steps to coordinate access or risk
 data inconsistency and race conditions. Note that Perl will protect its
 internals from your race conditions, but it won't protect you from you.
 
-=head1 Synchonisation and control
+=head1 Synchronization and control
 
 Perl provides a number of mechanisms to coordinate the interactions
 between themselves and their data, to avoid race conditions and the like.
 Some of these are designed to resemble the common techniques used in thread
 libraries such as C<pthreads>; others are Perl-specific. Often, the
-standard techniques are clumsly and difficult to get right (such as
+standard techniques are clumsily and difficult to get right (such as
 condition waits). Where possible, it is usually easier to use Perlish
 techniques such as queues, which remove some of the hard work involved.
 
@@ -523,9 +542,9 @@ techniques such as queues, which remove some of the hard work involved.
 The lock() function takes a shared variable and puts a lock on it.  
 No other thread may lock the variable until the the variable is unlocked
 by the thread holding the lock. Unlocking happens automatically
-when the locking thread exists the outermost block that contains
+when the locking thread exits the outermost block that contains
 C<lock()> function.  Using lock() is straightforward: this example has
-several threads doing some calculations in parallel, and occasionaly
+several threads doing some calculations in parallel, and occasionally
 updating a running total:
 
     use threads;
@@ -539,8 +558,8 @@ updating a running total:
            # (... do some calculations and set $result ...)
            {
                lock($total); # block until we obtain the lock
-               $total += $result
-           } # lock implicity released at end of scope
+               $total += $result;
+           } # lock implicitly released at end of scope
            last if $result == 0;
        }
     }
@@ -579,7 +598,7 @@ lock() on the variable goes out of scope. For example:
        {
            {
                lock($x); # wait for lock
-               lock($x): # NOOP - we already have the lock
+               lock($x); # NOOP - we already have the lock
                {
                    lock($x); # NOOP
                    {
@@ -609,7 +628,7 @@ traditional thread libraries.
 
 Locks are a handy tool to synchronize access to data, and using them
 properly is the key to safe shared data.  Unfortunately, locks aren't
-without their dangers, espacially when multiple locks are involved.
+without their dangers, especially when multiple locks are involved.
 Consider the following code:
 
     use threads; 
@@ -652,7 +671,7 @@ order.  If, for example, you lock variables $a, $b, and $c, always lock
 $a before $b, and $b before $c.  It's also best to hold on to locks for
 as short a period of time to minimize the risks of deadlock.
 
-The other syncronisation primitives described below can suffer from
+The other synchronization primitives described below can suffer from
 similar problems.
 
 =head2 Queues: Passing Data Around
@@ -665,7 +684,7 @@ this:
     use threads; 
     use threads::shared::queue;
 
-    my $DataQueue = threads::shared::queue->new()
+    my $DataQueue = threads::shared::queue->new; 
     $thr = threads->new(sub { 
         while ($DataElement = $DataQueue->dequeue) { 
             print "Popped $DataElement off the queue\n";
@@ -677,7 +696,7 @@ this:
     $DataQueue->enqueue(\$thr); 
     sleep 10; 
     $DataQueue->enqueue(undef);
-    $thr->join();
+    $thr->join;
 
 You create the queue with C<new threads::shared::queue>.  Then you can
 add lists of scalars onto the end with enqueue(), and pop scalars off
@@ -730,9 +749,9 @@ gives a quick demonstration:
         } 
     }
 
-    $thr1->join();
-    $thr2->join();
-    $thr3->join();
+    $thr1->join;
+    $thr2->join;
+    $thr3->join;
 
 The three invocations of the subroutine all operate in sync.  The
 semaphore, though, makes sure that only one thread is accessing the
@@ -762,8 +781,8 @@ of these defaults simply by passing in different values:
         $semaphore->up(5); # Increment the counter by five
     }
 
-    $thr1->detach();
-    $thr2->detach();
+    $thr1->detach;
+    $thr2->detach;
 
 If down() attempts to decrement the counter below zero, it blocks until
 the counter is large enough.  Note that while a semaphore can be created
@@ -873,7 +892,7 @@ things we've covered.  This program finds prime numbers using threads.
     14 } 
     15
     16 $stream->enqueue(undef);
-    17 $kid->join();
+    17 $kid->join;
     18
     19 sub check_num {
     20     my ($upstream, $cur_prime) = @_;
@@ -889,7 +908,7 @@ things we've covered.  This program finds prime numbers using threads.
     30         }
     31     } 
     32     $downstream->enqueue(undef) if $kid;
-    33     $kid->join()                if $kid;
+    33     $kid->join          if $kid;
     34 }
 
 This program uses the pipeline model to generate prime numbers.  Each
@@ -955,6 +974,24 @@ be little different than ordinary code.
 Also note that under the current implementation, shared variables
 use a little more memory and are a little slower than ordinary variables.
 
+=head1 Threadsafety of System Libraries
+
+Whether various library calls are threadsafe is outside the control
+of Perl.  Calls often suffering from not being threadsafe include:
+localtime(), gmtime(), get{gr,host,net,proto,serv,pw}*(), readdir(),
+rand(), and srand() -- in general, calls that depend on some external
+state.
+
+If the system Perl is compiled in has threadsafe variants of such
+calls, they will be used.  Beyond that, Perl is at the mercy of
+the threadsafety or unsafety of the calls.  Please consult your
+C library call documentation.
+
+In some platforms the threadsafe interfaces may fail if the result
+buffer is too small (for example getgrent() may return quite large
+group member lists).  Perl will retry growing the result buffer
+a few times, but only up to 64k (for safety reasons).
+
 =head1 Conclusion
 
 A complete thread tutorial could fill a book (and has, many times),
@@ -1021,7 +1058,7 @@ of the prime number generator.
 
 =head1 AUTHOR
 
-Dan Sugalski E<lt>sugalskd@ous.eduE<gt>
+Dan Sugalski E<lt>dan@sidhe.org<gt>
 
 Slightly modified by Arthur Bergman to fit the new thread model/module.