在 Lock::ConditionVariable 中§

有关方法 signal,请参见主要文档 in context

method signal()

当且仅当有任何线程先前在条件变量上等待时,它才会解除其中至少一个线程的阻塞。让我们看看它在这个示例中的工作原理

constant ITEMS = 100;
for 1..15 -> $iter {
    my $lock = Lock.new;
    my $cond = $lock.condition;
    my $todo = 0;
    my $done = 0;
    my @in = 1..ITEMS;
    my @out = 0 xx ITEMS;
 
    for 1..ITEMS -> $i {
        my $in = $i;
        my $out := @out[$i];
        Thread.start{
                    $out = $in * 10;
                    $lock.protect{
                        $done++;
                        $cond.signal if $done == $todo;
                    } );
        } );
        $todo++;
    }
    $lock.protect{
        $cond.wait({  $done == $todo } );
    });
    say @out;
}

我们重复 15 次相同的操作:启动 100 个线程,每个线程修改数组中的单个元素。我们protect全局变量 $done 的修改,并使用 signal 唤醒另一个线程去做它的工作。这将输出生成数组的第一个元素。

在 Proc 中§

有关方法 signal,请参见主要文档 in context

method signal(Proc:D:)

返回外部进程被终止时的信号号,否则返回 0 或未定义的值。

在 Supply 中§

有关子例程 signal,请参见主要文档 in context

sub signal(*@signals:$scheduler = $*SCHEDULER)

为指定的信号枚举(例如 SIGINT)和一个可选的 :scheduler 参数创建一个供应。收到的任何信号都将在供应中发出。例如

signal(SIGINT).tap{ say "Thank you for your attention"exit 0 } );

将捕获 Control-C,表示感谢,然后退出。

要从信号号转到 Signal,你可以执行类似这样的操作

signal(Signal(2)).tap-> $sig { say "Received signal: $sig" } );

可以通过检查 Signal::.keys(就像检查任何枚举一样)来查找受支持信号的列表。有关枚举工作原理的更多详细信息,请参见 enum

注意: Rakudo 2018.05 及更早版本存在一个错误,导致某些系统上的信号数值不正确。例如,Signal(10) 返回 SIGBUS,即使它在特定系统上实际上是 SIGUSR1。也就是说,在 2018.04、2018.04.1 和 2018.05 以外的所有 Rakudo 版本中,使用 signal(SIGUSR1) 都可以按预期工作,在这些版本中,可以通过使用 signal(SIGBUS) 来实现预期行为。这些问题已在 2018.05 之后的 Rakudo 版本中得到解决。

在 Kernel 中§

有关方法 signal,请参见主要文档 in context

multi method signal(Kernel:D: Str:D $signal --> Int:D)
multi method signal(Kernel:D: Signal:D \signal --> Int:D)
multi method signal(Kernel:D: Int:D \signal --> Int:D)

返回给定名称的 Kernel 对象的 Signal 数值代码的实例方法。

say $*KERNEL.signal("INT"); # OUTPUT: «2␤»