September 14, 2011

Assignment 1 - Practical Part

Screenshots of the code and its execution in the terminal. At the end I put the same code, but I can't show whit syntax highligther because the Internet in the UANL is very bad, and I need to modify the HTML code.

File synch.cc.


File threadtest.cc with our code.




We don't have any error after compile.


Screenshot of Producer-Consumer execution with semaphores.


Screenshot of Producer-Consumer execution with locks.


Some code:
Lock * L = new Lock("Lock");
void ConsumerLock(int which) {
  while (1) {
    if (disponibles > 0) {
      L->Acquire();
      disponibles--;
      printf("Thread %d >> Consumidor >> disponibles %d\n",
              which, disponibles);
      L->Release();
    }
    if (disponibles == 0) {
      currentThread->Finish();
    }
    currentThread->Yield();
  }
}
void ProducerLock(int which) {
  while (1) {
    if (disponibles < 15) {
      L->Acquire();
      disponibles++;
      printf("Thread %d >> Productor >> disponibles %d\n",
              which, disponibles);
      L->Release();
    }
    if (disponibles == 15) {
      currentThread->Finish();
    }
    currentThread->Yield();
  }
}
void ThreadTestLocks() {
  DEBUG('t', "Entra al ThreadTestLocks");
  printf("Locks\n");
  
  Thread *t = new Thread("Consumer");
  t->Fork((VoidFunctionPtr)ConsumerLock, (void *)1);

  Thread *tr = new Thread("Productor");
  tr->Fork((VoidFunctionPtr)ProducerLock, (void *)1);

  ProducerLock(0);
}

9 comments:

  1. Que tal compañeros!!! :)

    Muy buena clase, lastima la infraestructura de nuestra universidad.

    Una gran recomendación, sería bueno que activaran la función isHeldByCurrentThread, el prototipo ya esta en el código de nachos y no es difícil de implementar; es muy necesaria ya que, como podrán recordar, el candado no puede ser abierto por cualquier Hilo, solamente por aquel que lo cerro al inicio.
    Solo agreguen al prototipo del constructor del candado una variable que almacene el Thread que cierra el candado y cuando intenten abrirlo, en la función release, implementar un assert que realiza tal verificación llamando a la función.
    Suerte :)

    ReplyDelete
  2. Muy buen código,luego puedes intentar poner varios consumidores y productores para ver el resultado de la ejecución, suele ser muy educativo el tener mas de un thread de un tipo corriendo en el productor-consumidor.

    ReplyDelete
  3. en el while(1) puedes poner algo asi:
    while(buffer == limite)
    y asi te evitas algunos If

    ReplyDelete
  4. creo que la duda acerca de porque en nuestro codigo solo aparecia uno comiendo mientras los otros cuatro pensaban era tuya :p
    pues mira lo que pasa en el codigo es que como es random pasa ese tipo de cosas lo que hicimos fue darle mas justicia al momento de pasar los tenedores y que no ocurran cosas asi

    ReplyDelete
  5. Es cierto lo que dices que pasa en nuestro código, Ramón. 4 filósofos están esperando y uno pensando (si era así verdad?). No me había fijado. Tendrémos que arreglar ese tipo de detalles :)

    ReplyDelete
  6. Pues tu ProducerLocker se esta ejecutando doble porque estas llamando un fork y despues mandas llamar el hilo directamente, es por ello que en tu codigo aparecen 2 producer, 1 consumer.
    Deberias cambiar a 1 producer y 2 consumer, es divertido ver fallar el scheduler mas "justo" el FCFS. solo tienes que crear muchos hilos de consumo y pocos de produccion, asi el scheduler se vuelve loco! intentalo, asi podras comprobar la eficiencia de tus locks.

    ReplyDelete
  7. Puntos extra por comentarios a JC, Jorge, Cecy y Everardo

    ReplyDelete
  8. (Opongo a capturas de pantalla de código y de salidas. Es mejor ponerlos _antes_ de la presentación para no tener que batallar con la mugre wuanl.)

    ReplyDelete
  9. QUE ES HARD SWAP?
    DIGO, POR TU PRESENTACIÓN TEÓRICA DE HOY :)

    -ESTEBAN SIFUENTES

    ReplyDelete