| threads - Perl interpreter-based threads |
threads - Perl interpreter-based threads
This document describes threads version 1.12
use threads ('yield', 'stack_size' => 1_000_000);
sub start_thread {
my @args = @_;
print "Thread started: @args\n";
}
my $thread = threads->create('start_thread', 'argument');
$thread->join();
threads->create(sub { print("I am a thread\n"); })->join();
my $thread3 = async { foreach (@files) { ... } };
$thread3->join();
# Invoke thread in list context so it can return a list
my ($thr) = threads->create(sub { return (qw/a b c/); });
my @results = $thr->join();
$thread->detach();
$thread = threads->self();
$thread = threads->object($tid);
$tid = threads->tid();
$tid = threads->self->tid();
$tid = $thread->tid();
threads->yield();
yield();
my @threads = threads->list();
my $thread_count = threads->list();
if ($thr1 == $thr2) {
...
}
$stack_size = threads->get_stack_size();
$old_size = threads->set_stack_size(2_000_000);
Perl 5.6 introduced something called interpreter threads. Interpreter threads are different from 5005threads (the thread model of Perl 5.005) by creating a new Perl interpreter per thread, and not sharing any data or state between threads by default.
Prior to Perl 5.8, this has only been available to people embedding Perl, and
for emulating fork() on Windows.
The threads API is loosely based on the old Thread.pm API. It is very important to note that variables are not shared between threads, all variables are by default thread local. To use shared variables one must use the threads::shared manpage.
It is also important to note that you must enable threads by doing use
threads as early as possible in the script itself, and that it is not
possible to enable threading inside an eval "", do, require, or
use. In particular, if you are intending to share variables with
the threads::shared manpage, you must use threads before you use threads::shared.
(threads will emit a warning if you do it the other way around.)
undef if thread creation failed.
FUNCTION may either be the name of a function, an anonymous subroutine, or a code ref.
my $thr = threads->create('func_name', ...);
# or
my $thr = threads->create(sub { ... }, ...);
# or
my $thr = threads->create(\&func, ...);
The thread may be created in list context, or scalar context as follows:
# Create thread in list context
my ($thr) = threads->create(...);
# Create thread in scalar context
my $thr = threads->create(...);
This has consequences for the ->join() method describe below.
Although a thread may be created in void context, to do so you must
chain either the ->join() or ->detach() method to the
->create() call:
threads->create(...)->join();
The ->new() method is an alias for ->create().
join()->join() will return the return value(s) of the
entry point function.
The context (void, scalar or list) of the thread creation is also the
context for ->join(). This means that if you intend to return an array
from a thread, you must use my ($thr) = threads-create(...)>, and that
if you intend to return a scalar, you must use my $thr = ...:
# Create thread in list context
my ($thr1) = threads->create(sub {
my @results = qw(a b c);
return (@results);
};
# Retrieve list results from thread
my @res1 = $thr1->join();
# Create thread in scalar context
my $thr2 = threads->create(sub {
my $result = 42;
return ($result);
};
# Retrieve scalar result from thread
my $res2 = $thr2->join();
If the program exits without all other threads having been either joined or detached, then a warning will be issued. (A program exits either because one of its threads explicitly calls exit(), or in the case of the main thread, reaches the end of the main program file.)
detach()Calling ->join() on a detached thread will cause an error to be thrown.
detach()self()tid()tid()object($tid)undef if there is no thread
associated with the TID, if the thread is joined or detached, if no TID is
specified or if the specified TID is undef.
yield()You may do use threads qw(yield), and then just use yield() in your
code.
list()equal($thr2)
if ($thr1 == $thr2) {
print("Threads are the same\n");
}
(Thread comparison is based on thread IDs.)
async creates a thread to execute the block immediately following
it. This block is treated as an anonymous subroutine, and so must have a
semi-colon after the closing brace. Like threads-create()>, async
returns a threads object.
_handle()CreateThread; for other platforms, it is the pointer returned
by pthread_create.
This method is of no use for general Perl threads programming. Its intent is to provide other (XS-based) thread modules with the capability to access, and possibly manipulate, the underlying thread structure associated with a Perl thread.
_handle()
The default per-thread stack size for different platforms varies significantly, and is almost always far more than is needed for most applications. On Win32, Perl's makefile explicitly sets the default stack to 16 MB; on most other platforms, the system default is used, which again may be much larger than is needed (e.g., the Linux default is around 8 MB).
By tuning the stack size to more accurately reflect your application's needs, you may significantly reduce your application's memory usage, and increase the number of simultaneously running threads.
N.B., on Windows, Address space allocation granularity is 64 KB, therefore, setting the stack smaller than that on Win32 Perl will not save any more memory.
pthread_attr_setstacksize() (for pthreads platforms), or supply the
stack size to CreateThread() (for Win32 Perl).
(Obviously, this call does not affect any currently extant threads.)
PERL5_ITHREADS_STACK_SIZE:
PERL5_ITHREADS_STACK_SIZE=1000000
export PERL5_ITHREADS_STACK_SIZE
perl -e'use threads; print(threads->get_stack_size(), "\n")'
This value overrides any stack_size parameter given to use threads. Its
primary purpose is to permit setting the per-thread stack size for legacy
threaded applications.
$thr2) that inherits the stack size from an
existing thread ($thr1). This is shorthand for the following:
my $stack_size = $thr1->get_stack_size();
my $thr2 = threads->create({'stack_size' => $stack_size}, FUNCTION, ARGS);
$thr->set_stack_size($size);
useithreads configuration option.
Having threads support requires all of Perl and all of the XS modules in the Perl installation to be rebuilt; it is not just a question of adding the the threads manpage module (i.e., threaded and non-threaded Perls are binary incompatible.)
fork() inside BEGIN blocks
is an equally losing proposition, since it has been implemented in very much
the same way as threads.)
perl -V), signal handling is not threadsafe.
(Before you consider posting a bug report, please consult, and possibly post a message to the discussion forum to see if what you've encountered is a known problem.)
View existing bug reports at, and submit any new bugs, problems, patches, etc. to: http://rt.cpan.org/NoAuth/Bugs.html
Perl 5.8.0 or later
the threads manpage Discussion Forum on CPAN: http://www.cpanforum.com/dist/threads
Annotated POD for the threads manpage: http://annocpan.org/~JDHEDDEN/threads-1.12/shared.pm
the threads::shared manpage, the perlthrtut manpage
http://www.perl.com/pub/a/2002/06/11/threads.html and http://www.perl.com/pub/a/2002/09/04/threads.html
Perl threads mailing list: http://lists.cpan.org/showlist.cgi
Stack size discussion: http://www.perlmonks.org/
Artur Bergman <sky AT crucially DOT net>
threads is released under the same license as Perl.
CPAN version produced by Jerry D. Hedden <jdhedden AT cpan DOT org>
Richard Soderberg <perl AT crystalflame DOT net> - Helping me out tons, trying to find reasons for races and other weird bugs!
Simon Cozens <simon AT brecon DOT co DOT uk> - Being there to answer zillions of annoying questions
Rocco Caputo <troc AT netrus DOT net>
Vipul Ved Prakash <mail AT vipul DOT net> - Helping with debugging
Dean Arnold <darnold AT presicient DOT com> - Stack size API
| threads - Perl interpreter-based threads |