Le module Thread::Semaphore permet de s'assurer de partager un
compteur entre ses threads tout en étant sur que l'accès à ce
compteur se fait de façon atomique.
use threads;
use Thread::Semaphore;
use Perl6::Say;
my $max = new Thread::Semaphore(40);
sub sleep_one {
my $number = shift;
sleep(1);
say $number;
$max -> up;
return $number;
}
for(my $i = 1; $i <= 10000; $i++) {
$max -> down;
threads -> create(\&sleep_one,$i) -> detach();
}
sleep(5);
La fonction sleep_one ne fait que dormir une seconde avant d'imprimer son argument puis de rendre la main. Comme nous avons demander au programme de créer 10000 threads, il y a de fortes chances qu'on ai atteind un nombre relativement élevé de threads beaucoup plus vite pour que votre système ne peut le supporter.
On initialise un compteur à 40 que l'on décrémente à chaque création de thread, puis on l'incrémente à chaque fois qu'un thread meurt.
Nous somme surs de ne jamais créer plus de 40 threads fils.