BrowserREPL-button-tip-on BrowserREPL-button-tip-off

EditButtonTip 2023-03-07

class Thread

Concurrent execution of code (low-level)

class Thread {}
Code

A thread is a sequence of instructions that can (potentially) run in parallel to others. Class Thread provides a bit of abstraction over threads provided by the underlying virtual machines (which in turn might or might not be operating system threads).

Since threads are fairly low-level, most applications should use other primitives, like start, which also runs in parallel and returns a Promise.

my @threads = (^10).map: {
    Thread.start(
        name => "Sleepsorter $_",
        sub {
            my $rand = (^10).pick;
            sleep $rand;
            say $rand;
        },
    );
}

.finish for @threads;
Code

The current thread is available in the dynamic variable $*THREAD.

Methods§

method new§

method new(:&code!, Bool :$app_lifetime = False, Str :$name = '<anon>' --> Thread:D)
Code

Creates and returns a new Thread, without starting it yet. &code is the code that will be run in a separate thread.

$name is a user-specified string that identifies the thread.

If $app_lifetime is set to True, then the thread is killed when the main thread of the process terminates. If set to False, the process will only terminate when the thread has finished.

method start§

method start(Thread:U: &code, Bool :$app_lifetime = False, Str :$name = '<anon>' --> Thread:D)
Code

Creates, runs and returns a new Thread. Note that it can (and often does) return before the thread's code has finished running.

method run§

method run(Thread:D:)
Code

Runs the thread, and returns the invocant. It is an error to run a thread that has already been started.

method id§

method id(Thread:D: --> Int:D)
Code

Returns a numeric, unique thread identifier.

method finish§

method finish(Thread:D:)
Code

Waits for the thread to finish. This is called join in other programming systems.

method join§

method join(Thread:D:)
Code

Waits for the thread to finish.

method yield§

method yield(Thread:U:)
Code

Tells the scheduler to prefer another thread for now.

Thread.yield;
Code

method app_lifetime§

method app_lifetime(Thread:D: --> Bool:D)
Code

Returns False unless the named parameter :app_lifetime is specifically set to True during object creation. If the method returns False it means that the process will only terminate when the thread has finished while True means that the thread will be killed when the main thread of the process terminates.

my $t1 = Thread.new(code => { for 1..5 -> $v { say $v }});
my $t2 = Thread.new(code => { for 1..5 -> $v { say $v }}, :app_lifetime);

say $t1.app_lifetime;                 # OUTPUT: «False␤»
say $t2.app_lifetime;                 # OUTPUT: «True␤»
Code

method name§

method name(Thread:D: --> Str:D)
Code

Returns the user defined string, which can optionally be set during object creation in order to identify the Thread, or '<anon>' if no such string was specified.

my $t1 = Thread.new(code => { for 1..5 -> $v { say $v }});
my $t2 = Thread.new(code => { for 1..5 -> $v { say $v }}, name => 'my thread');

say $t1.name;                 # OUTPUT: «<anon>␤»
say $t2.name;                 # OUTPUT: «my thread␤»
Code

method Numeric§

method Numeric(Thread:D: --> Int:D)
Code

Returns a numeric, unique thread identifier, i.e. the same as id.

method Str§

method Str(Thread:D: --> Str:D)
Code

Returns a string which contains the invocants thread id and name.

my $t = Thread.new(code => { for 1..5 -> $v { say $v }}, name => 'calc thread');
say $t.Str;                           # OUTPUT: «Thread<3>(calc thread)␤»
Code

method is-initial-thread§

method is-initial-thread(--> Bool)
Code

Returns a Bool indicating whether the current thread (if called as a class method) or the Thread object on which it is called, is the initial thread the program started on.

say Thread.is-initial-thread;    # True if this is the initial thread
say $*THREAD.is-initial-thread;  # True if $*THREAD is the initial thread
Code

Please note there is no guarantee that this is actually the main thread from the OS's point of view. Also note that if you need this other than from a pure introspection / debugging point of view, that there are probably better ways to achieve what you're trying to achieve.

Routines§

sub full-barrier§

sub full-barrier()
Code

Performs a full memory barrier, preventing re-ordering of reads/writes. Required for implementing some lock-free data structures and algorithms.

Class relation diagram§

Rakudo Type Relation for Thread Thread Thread Any Any Thread->Any is