El módulo Coro::Semaphore proporciona objetos semáforos con contador. El contador indica el número de de corutinas clientes que pueden compartir el recurso antes de que se bloquee.
pp2@nereida:~/src/perl/coro$ cat -n prodconssemaphor.pl 1 #!/usr/bin/perl 2 use warnings; 3 use strict; 4 5 use Coro; 6 use Coro::Semaphore; 7 8 my @buffer; 9 10 my $produced = Coro::Semaphore->new(0); 11 my $finished = Coro::Semaphore->new(0); 12 13 async { 14 for my $i (0..9) { 15 print "Produced $i\n"; 16 push @buffer, $i; 17 $produced->up; 18 cede if @buffer > 5; 19 } 20 21 print "Work done\n"; 22 $finished->up; 23 }; 24 25 async { 26 while () { 27 $produced->down; 28 my $i = shift @buffer; 29 print "Consumed $i\n"; 30 } 31 }; 32 33 $finished->down; 34 35 print "Job finished\n";
pp2@nereida:~/src/perl/coro$ prodconssemaphor.pl Produced 0 Produced 1 Produced 2 Produced 3 Produced 4 Produced 5 Consumed 0 Consumed 1 Consumed 2 Consumed 3 Consumed 4 Consumed 5 Produced 6 Produced 7 Produced 8 Produced 9 Work done Consumed 6 Consumed 7 Consumed 8 Consumed 9 Job finished
Casiano Rodríguez León