class Thread {}

线程是一系列指令,可以(可能)并行于其他指令运行。类 Thread 提供了对底层虚拟机(反过来可能或可能不是操作系统线程)提供的线程的一些抽象。

由于线程是相当底层的,因此大多数应用程序应该使用其他基元,如 start,它也并行运行并返回 Promise

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

当前线程在动态变量 $*THREAD 中可用。

方法§

方法 new§

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

创建并返回一个新的 Thread,而不启动它。&code 是将在单独线程中运行的代码。

$name 是一个用户指定的字符串,用于标识线程。

如果 $app_lifetime 设置为 True,则当进程的主线程终止时,线程将被终止。如果设置为 False,则只有当线程完成时,进程才会终止。

方法 start§

method start(Thread:U: &codeBool :$app_lifetime = FalseStr :$name = '<anon>' --> Thread:D)

创建、运行并返回一个新的 Thread。请注意,它可以在线程的代码完成运行之前返回(并且通常会返回)。

方法 run§

method run(Thread:D:)

运行线程,并返回调用者。运行已启动的线程是一个错误。

方法 id§

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

返回一个数字,唯一的线程标识符。

方法 finish§

method finish(Thread:D:)

等待线程完成。在其他编程系统中,这称为 join

方法 join§

method join(Thread:D:)

等待线程完成。

方法 yield§

method yield(Thread:U:)

告诉调度程序现在更喜欢另一个线程。

Thread.yield;

方法 app_lifetime§

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

返回 False,除非在对象创建期间将命名参数 :app_lifetime 特别设置为 True。如果该方法返回 False,则表示只有当线程完成时,进程才会终止,而 True 表示当进程的主线程终止时,线程将被终止。

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␤»

方法名称§

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

返回用户定义的字符串,该字符串可以在对象创建期间选择性地设置,以识别Thread,如果未指定此类字符串,则返回'<anon>'

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␤»

方法 Numeric§

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

返回一个数字,唯一的线程标识符,即与id相同。

方法 Str§

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

返回一个包含调用者线程 ID名称的字符串。

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

方法 is-initial-thread§

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

返回一个布尔值,指示当前线程(如果作为类方法调用)或调用它的 Thread 对象是否是程序启动时的初始线程。

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

请注意,不能保证这实际上是从操作系统的角度来看的主线程。另请注意,如果您需要这方面的内容,除了纯粹的内省/调试观点之外,可能还有更好的方法来实现您想要实现的目标。

例程§

子例程 full-barrier§

sub full-barrier()

执行一个完全内存屏障,防止读/写重新排序。实现一些无锁数据结构和算法时需要。

类型图§

Thread 的类型关系
raku-type-graph Thread Thread Any Any Thread->Any Mu Mu Any->Mu

展开上面的图表