Les dejo un link para descargar los ficheros. Les agradecería mucho su ayuda ayuda porque ya me perdí. Disculpen las molestias.
http://www.megaupload.com/?d=T4K26FXO
He creado cuatro ficheros. Este es el que llamé Principal.cgi
Using perl Syntax Highlighting
- use Filosofo;
- use Tenedor;
- use Mesa;
- use threads;
- use Thread::Semaphore;
- use threads::shared;
- use CGI qw(:all);
- use Time::HiRes(qw(usleep));
- use constant LIMIT =>100;
- print "\n********MESA PREPARADA***********=)\n";
- my $hilo0=threads->new(\&Filosofo::Nuevo, 0);
- my $hilo1=threads->new(\&Filosofo::Nuevo, 1);
- my $hilo2=threads->new(\&Filosofo::Nuevo, 2);
- my $hilo3=threads->new(\&Filosofo::Nuevo, 3);
- my $hilo4=threads->new(\&Filosofo::Nuevo, 4);
- $hilo4->join();
- $hilo3->join();
- $hilo2->join();
- $hilo1->join();
- $hilo0->join();
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4
Archivo Mesa.pm
Using perl Syntax Highlighting
- #!/usr/local/bin/perl
- package Mesa;
- use threads;
- use Thread::Semaphore;
- use threads::shared;
- use Tenedor;
- use CGI qw(:all);
- use Time::HiRes(qw(usleep));
- my $tenedores=undef;
- my $Comensales=5; #valor entero
- my $self={};
- ###############
- sub Mesa::Nuevo {
- my $this=shift;
- my $class =ref($this)||$this;
- $Comensales=shift @_;
- $self->{COMENSALES}=$Comensales;
- bless $self, $class;
- CrearTenedores($Comensales);
- return ($self);
- }
- sub Mesa::CrearTenedores
- {
- my $self=shift;
- for(my $i=0;$i<$Comensales;$i++)
- {
- $tenedores[$i]=Tenedor->Nuevo($i);
- #print "\n posicion $i contenido= $tenedores[$i]";
- }
- }
- sub Mesa::tenedor
- {
- my $self=shift;
- return $tenedores[$i];
- }
- sub Mesa::mi_tenedor_derecho
- {
- my $self=shift;
- #$self->{COMENSALES}=shift @_;
- my $i=shift @_;
- return (($i+1) % ($self->{COMENSALES}));
- }
- sub Mesa::mi_tenedor_izquierdo
- {
- my $self=shift;
- my $i=shift @_;
- return $i;
- }
- #sub Mesa::Saludo
- #{ my $self=shift;
- # print "\nholaaaaaaaa";
- #}
- 1;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Archivo Filosofo.pm
Using perl Syntax Highlighting
- #!/usr/local/bin/perl
- package Filosofo;
- use Mesa;
- use threads;
- use Thread::Semaphore;
- use threads::shared;
- use Tenedor;
- use CGI qw(:all);
- use Time::HiRes(qw(usleep));
- my $Semaforo = new Thread::Semaphore;
- my $identidadHilo:shared=333333; #Sirve para identificar el hilo
- my $mesafilosofos= Mesa->Nuevo(5); #inicializa la mesa para 5 comensales
- my $self={};
- my $hilo;
- my $ind_der=0,$ind_izq=0;
- sub Filosofo::Ejecutar
- {
- # my $self=threads->self();
- for (my $j=0;$j<5;$j++)
- {
- #my $self=shift;
- #my $identidad= shift @_;
- Pensar($j);
- Protocolo_Entrada();
- Comer($j);
- Protocolo_Salida();
- }
- }
- sub Filosofo::devuelveidentidad
- {
- print "\nHilo ".$identidadHilo." --Iniciado \n";
- }
- sub Filosofo::Nuevo
- {
- #my $this=shift;
- #my $class =ref($this)||$this;
- $Semaforo->down;
- $identidadHilo=shift @_;
- $Semaforo->up;
- devuelveidentidad();
- $self->{IDENTIDAD}=$identidadHilo;
- $ind_izq=$mesafilosofos->mi_tenedor_izquierdo($identidadHilo);
- $ind_der=$mesafilosofos->mi_tenedor_derecho($identidadHilo);
- #bless $self, $class;
- Ejecutar();
- return ($self);
- }
- sub Filosofo::Pensar
- {
- my $retraso= (int rand()*10000);
- #my $self=shift;
- $Semaforo->down;
- $identidadHilo=shift @_;
- $Semaforo->up;
- $self->{IDENTIDAD}= $identidadHilo;
- print "\nFilosofo ".$identidadHilo." ESTA PENSANDO";
- usleep(int 1000000);
- print "\nFilosofo ".$identidadHilo." ha dejado de pensar";
- }
- sub Filosofo::Comer
- {
- #my $self=shift;
- my $retraso= (int rand()*1000);
- $Semaforo->down;
- $identidadHilo=shift @_;
- $Semaforo->up;
- $self->{IDENTIDAD}=$identidadHilo;
- #$self->{IDENTIDAD}= shift @_;
- #print "\nFilosofo ".$identidad." ESTA COMIENDO";
- print "\nFilosofo ".$identidadHilo." ESTA COMIENDoO";
- usleep(int 1000000);
- #print "\nFilosofo ".$identidad." ha dejado de comer";
- print "\nFilosofo ".$identidadHilo." ha dejado de comer";
- }
- sub Filosofo::Protocolo_Entrada
- {
- #my $self=shift;
- my $tder=Tenedor->Nuevo($ind_der);
- my $tizq=Tenedor->Nuevo($ind_izq);
- $tizq->Coger($ind_izq);
- $tder->Coger($ind_der);
- }
- sub Filosofo::Protocolo_Salida
- {
- #my $self=shift;
- my $tizq=Tenedor->Nuevo($ind_izq);
- my $tder=Tenedor->Nuevo($ind_der);
- $tizq->Soltar();
- $tder->Soltar();
- }
- 1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Archivo Tenedor.pm
Using perl Syntax Highlighting
- #!/usr/local/bin/perl 00000000
- package Tenedor;
- use threads;
- use CGI qw(:all);
- use Thread::Semaphore;
- use threads::shared;
- use strict;
- use Time::HiRes(qw(usleep));
- my $Semaforo = new Thread::Semaphore;
- my $VariableGlobal:shared=0;
- #my $self={};
- my $identidad:shared=100;
- #my $identidad=0;
- sub Tenedor::Nuevo{
- my $this=shift;
- $identidad= shift @_;
- my $class =ref($this)||$this;
- my $self=undef;
- $self->{IDENTIDAD}=$identidad;
- $self->{CODIGO}=0;
- bless $self,$class;
- return ($self);
- }
- sub Tenedor::Coger
- {
- $Semaforo->down;
- my $self=shift;
- $self->{IDENTIDAD}=shift@_;#$identidad;
- $self->{CODIGO}=$VariableGlobal;
- if ($self->{CODIGO})
- {
- print "\nTenedor ".$self->{IDENTIDAD}. "SE ESTAN PELEANDO POR MI";
- }
- else
- {
- $self->{CODIGO}=1;
- print"\nTenedooor ".$self->{IDENTIDAD}." Ha sido cogido por" .$identidad. ".";
- }
- $Semaforo->up;
- }
- sub Tenedor::Soltar{
- $Semaforo->down;
- my $self=shift;
- $self->{CODIGO}=0;
- $VariableGlobal=$self->{COGIDO};
- print "\nTenedor ".$self->{IDENTIDAD}." HA SIDO SOLTADO";
- $Semaforo->up;
- }
- sub Tenedor::DESTROY
- {
- my $self=shift;
- delete($self->{CODIGO});
- delete($self->{IDENTIDAD});
- }
- return 1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4