• Publicidad

Hilos para resolver el problema de filósofos comensales

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Hilos para resolver el problema de filósofos comensales

Notapor batussay » 2010-07-01 17:00 @750

Hola a todos, estoy realizando una tarea en la que creo que me he complicado. Mi programa debe simular al problema de los filósofos comensales. Tengo problemas en hacerlo funcionar correctamente.

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Filosofo;
  2. use Tenedor;
  3. use Mesa;
  4. use threads;
  5. use Thread::Semaphore;
  6. use threads::shared;
  7. use CGI qw(:all);
  8. use Time::HiRes(qw(usleep));
  9. use constant LIMIT =>100;
  10.  
  11. print "\n********MESA PREPARADA***********=)\n";
  12.  
  13. my $hilo0=threads->new(\&Filosofo::Nuevo, 0);
  14. my $hilo1=threads->new(\&Filosofo::Nuevo, 1);
  15. my $hilo2=threads->new(\&Filosofo::Nuevo, 2);
  16. my $hilo3=threads->new(\&Filosofo::Nuevo, 3);
  17. my $hilo4=threads->new(\&Filosofo::Nuevo, 4);
  18.  
  19. $hilo4->join();
  20. $hilo3->join();
  21. $hilo2->join();
  22. $hilo1->join();
  23. $hilo0->join();
  24.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Archivo Mesa.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. package Mesa;
  3. use threads;
  4. use Thread::Semaphore;
  5. use threads::shared;
  6. use Tenedor;
  7. use CGI qw(:all);
  8. use Time::HiRes(qw(usleep));
  9.  
  10. my $tenedores=undef;
  11. my  $Comensales=5;  #valor entero
  12. my $self={};
  13.  ###############
  14.  
  15. sub Mesa::Nuevo {
  16.  
  17.         my $this=shift;
  18.         my $class =ref($this)||$this;
  19.  
  20.         $Comensales=shift @_;
  21.         $self->{COMENSALES}=$Comensales;
  22.     bless $self, $class;
  23.  
  24.     CrearTenedores($Comensales);
  25.         return ($self);
  26.  
  27. }
  28. sub Mesa::CrearTenedores
  29. {
  30.      my $self=shift;
  31.      for(my $i=0;$i<$Comensales;$i++)
  32.      {
  33.         $tenedores[$i]=Tenedor->Nuevo($i);
  34.         #print  "\n posicion $i  contenido= $tenedores[$i]";
  35.      }
  36.  
  37. }
  38. sub Mesa::tenedor
  39. {
  40.      my $self=shift;
  41.      return $tenedores[$i];
  42. }
  43.  
  44. sub  Mesa::mi_tenedor_derecho
  45. {
  46.   my $self=shift;
  47.      #$self->{COMENSALES}=shift @_;
  48.      my $i=shift @_;
  49.      return (($i+1) % ($self->{COMENSALES}));
  50.  
  51. }
  52. sub  Mesa::mi_tenedor_izquierdo
  53. {
  54.     my $self=shift;
  55.      my $i=shift @_;
  56.      return $i;
  57. }
  58. #sub  Mesa::Saludo
  59. #{      my $self=shift;
  60. #     print "\nholaaaaaaaa";
  61. #}
  62.  
  63. 1;
  64.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Archivo Filosofo.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. package Filosofo;
  3. use Mesa;
  4. use threads;
  5. use Thread::Semaphore;
  6. use threads::shared;
  7. use Tenedor;
  8. use CGI qw(:all);
  9. use Time::HiRes(qw(usleep));
  10.  
  11. my $Semaforo = new Thread::Semaphore;
  12. my $identidadHilo:shared=333333;        #Sirve para identificar el hilo
  13. my $mesafilosofos= Mesa->Nuevo(5);  #inicializa la mesa para 5 comensales
  14. my $self={};
  15. my $hilo;
  16. my $ind_der=0,$ind_izq=0;
  17.  
  18.  
  19. sub Filosofo::Ejecutar
  20. {
  21. #       my $self=threads->self();
  22.     for (my $j=0;$j<5;$j++)
  23.     {
  24.     #my $self=shift;
  25.     #my $identidad= shift @_;
  26.         Pensar($j);
  27.         Protocolo_Entrada();
  28.         Comer($j);
  29.     Protocolo_Salida();
  30.     }
  31.  
  32. }
  33.  
  34. sub Filosofo::devuelveidentidad
  35. {
  36. print "\nHilo ".$identidadHilo." --Iniciado \n";
  37. }
  38.  
  39. sub Filosofo::Nuevo
  40. {
  41.         #my $this=shift;
  42.         #my $class =ref($this)||$this;
  43.     $Semaforo->down;
  44.  
  45.         $identidadHilo=shift @_;
  46.  
  47.    $Semaforo->up;
  48.    devuelveidentidad();
  49.  
  50.     $self->{IDENTIDAD}=$identidadHilo;
  51.     $ind_izq=$mesafilosofos->mi_tenedor_izquierdo($identidadHilo);
  52.     $ind_der=$mesafilosofos->mi_tenedor_derecho($identidadHilo);
  53.     #bless $self, $class;
  54.     Ejecutar();
  55.         return ($self);
  56. }
  57. sub Filosofo::Pensar
  58. {
  59. my $retraso= (int rand()*10000);
  60.         #my $self=shift;
  61.  
  62.     $Semaforo->down;
  63.         $identidadHilo=shift @_;
  64.     $Semaforo->up;
  65.  
  66.     $self->{IDENTIDAD}= $identidadHilo;
  67.  
  68.     print "\nFilosofo ".$identidadHilo." ESTA PENSANDO";
  69.  
  70.     usleep(int 1000000);
  71.     print "\nFilosofo ".$identidadHilo." ha dejado de pensar";
  72. }
  73.  
  74. sub Filosofo::Comer
  75. {
  76.         #my $self=shift;
  77.         my $retraso= (int rand()*1000);
  78.     $Semaforo->down;
  79.         $identidadHilo=shift @_;
  80.     $Semaforo->up;
  81.     $self->{IDENTIDAD}=$identidadHilo;
  82.         #$self->{IDENTIDAD}= shift @_;
  83.     #print "\nFilosofo ".$identidad." ESTA COMIENDO";
  84.  
  85.     print "\nFilosofo ".$identidadHilo." ESTA COMIENDoO";
  86.  
  87.     usleep(int 1000000);
  88.  
  89.     #print "\nFilosofo ".$identidad." ha dejado de comer";
  90.     print "\nFilosofo ".$identidadHilo." ha dejado de comer";
  91.  
  92. }
  93. sub Filosofo::Protocolo_Entrada
  94. {
  95.  
  96.     #my $self=shift;
  97.  
  98.     my $tder=Tenedor->Nuevo($ind_der);
  99.     my $tizq=Tenedor->Nuevo($ind_izq);
  100.     $tizq->Coger($ind_izq);
  101.     $tder->Coger($ind_der);
  102.  
  103.  
  104.  
  105. }
  106. sub Filosofo::Protocolo_Salida
  107. {
  108.     #my $self=shift;
  109.         my $tizq=Tenedor->Nuevo($ind_izq);
  110.     my $tder=Tenedor->Nuevo($ind_der);
  111.     $tizq->Soltar();
  112.     $tder->Soltar();
  113.  
  114. }
  115. 1;
  116.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Archivo Tenedor.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl 00000000
  2. package Tenedor;
  3.  use threads;
  4. use CGI qw(:all);
  5. use Thread::Semaphore;
  6. use threads::shared;
  7. use strict;
  8. use Time::HiRes(qw(usleep));
  9.  
  10. my $Semaforo = new Thread::Semaphore;
  11. my $VariableGlobal:shared=0;
  12. #my $self={};
  13.  
  14. my $identidad:shared=100;
  15.  #my $identidad=0;
  16.  
  17. sub Tenedor::Nuevo{
  18.  
  19.         my $this=shift;
  20.         $identidad= shift @_;
  21.         my $class =ref($this)||$this;
  22.     my $self=undef;
  23.         $self->{IDENTIDAD}=$identidad;
  24.         $self->{CODIGO}=0;
  25.  
  26.         bless $self,$class;
  27.         return ($self);
  28.  
  29. }
  30.  
  31. sub Tenedor::Coger
  32. {
  33.  
  34.         $Semaforo->down;
  35.     my $self=shift;
  36.  
  37.     $self->{IDENTIDAD}=shift@_;#$identidad;
  38.  
  39.     $self->{CODIGO}=$VariableGlobal;
  40.  
  41.     if ($self->{CODIGO})
  42.     {
  43.         print "\nTenedor ".$self->{IDENTIDAD}. "SE ESTAN PELEANDO POR MI";
  44.     }
  45.     else
  46.     {
  47.                 $self->{CODIGO}=1;
  48.                 print"\nTenedooor ".$self->{IDENTIDAD}." Ha sido cogido por" .$identidad. ".";
  49.     }
  50.  
  51.         $Semaforo->up;
  52. }
  53.  
  54. sub Tenedor::Soltar{
  55.         $Semaforo->down;
  56.     my $self=shift;
  57.     $self->{CODIGO}=0;
  58.     $VariableGlobal=$self->{COGIDO};
  59.     print "\nTenedor ".$self->{IDENTIDAD}." HA SIDO SOLTADO";
  60.         $Semaforo->up;
  61.  
  62. }
  63.  
  64. sub Tenedor::DESTROY
  65. {
  66.     my $self=shift;
  67.     delete($self->{CODIGO});
  68.     delete($self->{IDENTIDAD});
  69.  
  70. }
  71.  
  72. return 1;
  73.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por batussay el 2010-07-02 07:59 @374, editado 1 vez en total
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249

Publicidad

Re: Hilos para resolver el problema de filósofos comensales

Notapor explorer » 2010-07-01 17:18 @763

Pero... ¡¡¡si llevas CASI TRES AÑOS con él...!!!

¿Cómo es posible tanto retraso? ¿No será que los profesores te lo han vuelto a pedir? :wink:

Hace poco hemos vuelto a hablar del tema, pero no dimos muchas pistas, aparte que se trataba de hacerlo con forks, no con threads.

El asunto no es sencillo, no...

No nos dices qué problemas estás teniendo...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 18 invitados