Regen toc.
[p5sagit/p5-mst-13.2.git] / pod / perlthrtut.pod
index 6a47e10..6fda10f 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
@@ -307,7 +316,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,7 +331,7 @@ 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;
@@ -335,7 +344,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 +402,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 +433,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
 
@@ -958,12 +966,20 @@ 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
+of Perl.  Calls often suffering from not being threadsafe include:
 localtime(), gmtime(), get{gr,host,net,proto,serv,pw}*(), readdir(),
-rand(), srand().  If the system Perl is compiled in has threadsafe
-variants of these calls, they will be used, but besides that, Perl is
-at the mercy of the thread safety or unsafety of the calls.  Please
-consult your C library call documentation.
+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
 
@@ -1031,7 +1047,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.