这里是 Perl 菜鸟,所以请温柔:)
我编写了以下代码来在我打猎时跟踪我的狗(不是真的)。每次狗找到鸭子时,它都会向主线程发出信号,然后从包中的每只狗那里收集信息。
#!/usr/bin/env perl
use strict;
use warnings;
use v5.14;
use threads;
{
package Dog;
sub new {
my ($class, $name, $dt) = @_;
my $self = {
dt => $dt, # will find a duck every $dt seconds
name => $name,
ducksfound => 0
};
bless $self, $class;
}
sub hunt {
#
# the "thread" method -- the dog will hang around for $dt seconds,
# then alert the main thread by sending SIGUSR1
#
my $self = shift;
while (1) {
sleep $self->{dt};
$self->{ducksfound} += 1;
kill USR1 => $$;
}
}
sub bark {
my $self = shift;
sprintf "%s: found %d ducks!", ($self->{name}, $self->{ducksfound});
}
1;
}
my @dogs;
$SIG{USR1} = sub {
say join ", ", map { $_->bark } @dogs;
};
push @dogs, Dog->new("Labrador", 1);
push @dogs, Dog->new("Retriever", 2);
push @dogs, Dog->new("Shepherd", 3);
threads->create( sub { $_->hunt } ) for @dogs;
$_->join for threads->list;
上述代码的预期输出将类似于:
拉布拉多:找到 1 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 2 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 3 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 3 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 4 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 5 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 6 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 6 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 6 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 1 只鸭子!
相反,我得到的是以下内容:
拉布拉多:找到 1 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 2 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 3 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 0 只鸭子!,猎犬:找到 1 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 4 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 5 只鸭子!,猎犬:找到 0 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:找到 0 只鸭子!,猎犬:找到 2 只鸭子!,牧羊犬:找到 0 只鸭子!
拉布拉多:发现 0 只鸭子!,猎犬:发现 0 只鸭子!,牧羊犬:发现 1 只鸭子!
请注意,当另一只狗说话时,每只狗的鸭子数量如何重置为零。
关于我在阅读 Llama 时必须忽略的特定脚注的任何见解?