=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.
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
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
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:
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
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
}
}
-
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.
$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 syncronization primitives described below can suffer from
+The other synchronization primitives described below can suffer from
similar problems.
=head2 Queues: Passing Data Around
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),
=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.