Je suis un débutant en Perl, alors soyez gentil :)
J'ai écrit le code suivant pour garder la trace de mes chiens lorsque je chasse (pas vraiment). Chaque fois qu'un chien trouve un canard, il signale le thread principal, qui collecte ensuite les informations de chacun des chiens de la meute.
#!/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;
La sortie attendue du code ci-dessus serait quelque chose comme :
Labrador : trouvé 1 canard !, Retriever : trouvé 0 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 2 canards !, Retriever : trouvé 0 canards !, Berger : trouvé 0 canards !
Labrador : trouvé 3 canards !, Retriever : trouvé 0 canards !, Berger : trouvé 0 canards !
Labrador : trouvé 3 canards !, Retriever : trouvé 1 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 4 canards !, Retriever : trouvé 1 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 5 canards !, Retriever : trouvé 1 canard !, Berger : trouvé 0 canard !
Labrador : trouvé 6 canards !, Retriever : trouvé 1 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 6 canards !, Retriever : trouvé 1 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 6 canards !, Retriever : trouvé 1 canard !, Berger : trouvé 1 canard !
Au lieu de cela, j'obtiens ce qui suit :
Labrador : trouvé 1 canard !, Retriever : trouvé 0 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 2 canards !, Retriever : trouvé 0 canards !, Berger : trouvé 0 canards !
Labrador : trouvé 3 canards !, Retriever : trouvé 0 canards !, Berger : trouvé 0 canards !
Labrador : trouvé 0 canard !, Retriever : trouvé 1 canard !, Shepherd : trouvé 0 canard !
Labrador : trouvé 4 canards !, Retriever : trouvé 0 canards !, Berger : trouvé 0 canards !
Labrador : trouvé 5 canards !, Retriever : trouvé 0 canards !, Berger : trouvé 0 canards !
Labrador : trouvé 0 canard !, Retriever : trouvé 2 canards !, Shepherd : trouvé 0 canard !
Labrador : trouvé 0 canard !, Retriever : trouvé 0 canard !, Shepherd : trouvé 1 canard !
Remarquez que le nombre de canards de chaque chien se remet à zéro lorsqu'un autre chien parle.
Avez-vous une idée de la note de bas de page que j'ai dû oublier en lisant le Lama ?