next up previous contents
suivant: Partager une variable entre monter: La programmation multi-threadée précédent: Réaliser un serveur SMTP   Table des matières

Utiliser les sémaphores

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.



2006-03-15