The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

threads - Perl interpreter-based threads

VERSION

This document describes threads version 1.15

SYNOPSIS

    use threads ('yield', 'stack_size' => 256*4096);

    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(512*4096);

DESCRIPTION

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 threads::shared.

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 threads::shared, you must use threads before you use threads::shared. (threads will emit a warning if you do it the other way around.)

$thr = threads->create(FUNCTION, ARGS)

This will create a new thread that will begin execution with the specified entry point function, and give it the ARGS list as parameters. It will return the corresponding threads object, or 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().

$thr->join()

This will wait for the corresponding thread to complete its execution. When the thread finishes, ->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.)

$thr->detach()

Makes the thread unjoinable, and causes any eventual return value to be discarded.

Calling ->join() on a detached thread will cause an error to be thrown.

threads->detach()

Class method that allows a thread to detach itself.

threads->self()

Class method that allows a thread to obtain its own threads object.

$thr->tid()

Returns the ID of the thread. Thread IDs are unique integers with the main thread in a program being 0, and incrementing by 1 for every thread created.

threads->tid()

Class method that allows a thread to obtain its own ID.

threads->object($tid)

This will return the threads object for the active thread associated with the specified thread ID. Returns 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.

threads->yield()

This is a suggestion to the OS to let this thread yield CPU time to other threads. What actually happens is highly dependent upon the underlying thread implementation.

You may do use threads qw(yield), and then just use yield() in your code.

threads->list()

In a list context, returns a list of all non-joined, non-detached threads objects. In a scalar context, returns a count of the same.

$thr1->equal($thr2)

Tests if two threads objects are the same thread or not. This is overloaded to the more natural form:

    if ($thr1 == $thr2) {
        print("Threads are the same\n");
    }

(Thread comparison is based on thread IDs.)

async BLOCK;

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.

$thr->_handle()

This private method returns the memory location of the internal thread structure associated with a threads object. For Win32, this is the handle returned by 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.

threads->_handle()

Class method that allows a thread to obtain its own handle.

THREAD STACK SIZE

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.

threads->get_stack_size();

Returns the current default per-thread stack size. The default is zero, which means the system default stack size is currently in use.

$size = $thr->get_stack_size();

Returns the stack size for a particular thread. A return value of zero indicates the system default stack size was used for the thread.

$old_size = threads->set_stack_size($new_size);

Sets a new default per-thread stack size, and returns the previous setting.

Some platforms have a minimum thread stack size. Trying to set the stack size below this value will result in a warning, and the minimum stack size will be used.

If needed, $new_size will be rounded up to the next multiple of the memory page size (usually 4096 or 8192).

Threads created after the stack size is set will then either call 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.)

use threads ('stack_size' => VALUE);

This sets the default per-thread stack size at the start of the application.

$ENV{'PERL5_ITHREADS_STACK_SIZE'}

The default per-thread stack size may be set at the start of the application through the use of the environment variable PERL5_ITHREADS_STACK_SIZE:

    PERL5_ITHREADS_STACK_SIZE=1048576
    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.

threads->create({'stack_size' => VALUE}, FUNCTION, ARGS)

This change to the thread creation method permits specifying the stack size for an individual thread.

$thr2 = $thr1->create(FUNCTION, ARGS)

This creates a new thread ($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);

WARNINGS

A thread exited while # other threads were still running

A thread (not necessarily the main thread) exited while there were still other threads running. Usually, it's a good idea to first collect the return values of the created threads by joining them, and only then exit from the main thread.

Using minimum thread stack size of #

Some platforms have a minimum thread stack size. Trying to set the stack size below this value will result in the above warning, and the stack size will be set to the minimum.

ERRORS

Cannot change stack size of an existing thread

The stack size of currently extant threads cannot be changed, therefore, the following results in the above error:

    $thr->set_stack_size($size);
This Perl not built to support threads

The particular copy of Perl that you're trying to use was not built using the 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 threads module (i.e., threaded and non-threaded Perls are binary incompatible.)

BUGS

Parent-child threads

On some platforms, it might not be possible to destroy parent threads while there are still existing child threads.

Creating threads inside BEGIN blocks

Creating threads inside BEGIN blocks (or during the compilation phase in general) does not work. (In Windows, trying to use fork() inside BEGIN blocks is an equally losing proposition, since it has been implemented in very much the same way as threads.)

PERL_OLD_SIGNALS are not threadsafe, will not be.

If your Perl has been built with PERL_OLD_SIGNALS (one has to explicitly add that symbol to ccflags, see perl -V), signal handling is not threadsafe.

Returning closures from threads

Returning a closure from a thread does not work, usually crashing Perl in the process.

Perl Bugs and the CPAN Version of threads

Support for threads extents beyond the code in this module (i.e., threads.pm and threads.xs), and into the Perl iterpreter itself. Older versions of Perl contain bugs that may manifest themselves despite using the latest version of threads from CPAN. There is no workaround for this other than upgrading to the lastest version of Perl.

(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?Dist=threads

REQUIREMENTS

Perl 5.8.0 or later

SEE ALSO

threads Discussion Forum on CPAN: http://www.cpanforum.com/dist/threads

Annotated POD for threads: http://annocpan.org/~JDHEDDEN/threads-1.15/shared.pm

threads::shared, perlthrtut

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?name=iThreads

Stack size discussion: http://www.perlmonks.org/?node_id=532956

AUTHOR

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>

ACKNOWLEDGEMENTS

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