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); }
Que tal compañeros!!! :)
ReplyDeleteMuy 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 :)
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.
ReplyDeleteen el while(1) puedes poner algo asi:
ReplyDeletewhile(buffer == limite)
y asi te evitas algunos If
creo que la duda acerca de porque en nuestro codigo solo aparecia uno comiendo mientras los otros cuatro pensaban era tuya :p
ReplyDeletepues 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
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 :)
ReplyDeletePues 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.
ReplyDeleteDeberias 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.
Puntos extra por comentarios a JC, Jorge, Cecy y Everardo
ReplyDelete(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.)
ReplyDeleteQUE ES HARD SWAP?
ReplyDeleteDIGO, POR TU PRESENTACIÓN TEÓRICA DE HOY :)
-ESTEBAN SIFUENTES