NachOS code.
This is our code that we implement in nachos, we made the bounded buffer producer-consumer code. We put our code in threadtest.cc file, this file is located in nachos/code/threads.
Our code is the next:
//PRODUCER FUNCTION
void Producer(void* id){
char* name = (char*)id;
while (i<=30){ empty -> P();
Sem -> P();
Producto++;
printf("%s - %d\n", name, Producto);
Sem -> V();
full -> V();
i++;
}
}
//CONSUMER FUNCTION
void Consumer(void* id){
char* name = (char*)id;
while(i<=20){ full -> P();
Sem -> P();
Producto --;
printf("%s - %d\n", name, Producto);
Sem -> V();
empty-> V();
i++;
}
}
//START FUNCTION
void start(){
//Initialize semaphores
Sem = new Semaphore("Sem",1);
empty = new Semaphore("empty",5);
full = new Semaphore("full",0);
Thread *t = new Thread("Producer");
t -> Fork(Producer,(void*) "Producer ");
t = new Thread("Consumer");
t -> Fork(Consumer, (void*) "Consumer");
}
//THREADTEST FUNCTION
/*
This function is implementing in nachos by default,
we just put the name of our method "start" to call it.
*/
void
ThreadTest()
{
DEBUG('t', "Entering SimpleTest");
for ( int k=1; k<=10; k++) { char* threadname = new char[100]; sprintf(threadname, "Hilo %d", k); Thread* newThread = new Thread (threadname); newThread->Fork (SimpleThread, (void*)threadname);
}
start(); //We agregate this line to call our method
SimpleThread( (void*)"Hilo 0");
}
Bueno aquí como lo comentamos en clase, sería bueno poner el sleep.
ReplyDeleteNada más una pequeña duda para que estas usando el SimpleThread?
en el full->V() tienes doble punto y coma :P
ReplyDeleteY una cosa... en esta parte
t = new Thread("Consumer");
t -> Fork(Consumer, (void*) "Consumer");
el primer parametro del consumer, es un nombre del objeto, o de la llamada al metodo ... o un nombre para debug?
Diana, como comenté en el mismo código, el método Threadtest() no lo realicé yo, solo dentro de este método mandé llamar a la función que sí hicimos nosotros "start()" ... SimpleThread() ya venía por default en Threadtest.cc
ReplyDeleteQue partes del threadtest.cc cambiaron o solo pusieron el codigo entero ahi dentro? esque estube leyendo eso del consumidor y productor y primero tenias que crear 2 archivos en el userprog uno con extension .cc y el otro con extension .h y luego modificar el archivo threadtest.cc ...
ReplyDeleteEver: Cuando creas el thread (t = new Thread("consumer")) se envía una cadena que es un parámetro que recibe el constructor, simplemente es un nombre para debug.
ReplyDeleteCuando inicializas el thread (t -> Fork(Consumer, (void*) "Consumer");))
El primer parámetro viene a ser como la función run() que tú implementas en Java, es lo que va a realizar el thread durante su ejecución, el segundo parámetro es opcional, alguna variable que te sea útil durante la ejecución del thread.
PD: Chequen el SintaxHighlighter de su blog, me lanza error cada que se actualiza su página, un error en el CSS creo.
SALUDOS :)
Veo que no usaron locks o condition variables, segun tengo entendido que la version de c++ solo trae semaforos, que tan complicado es agregar estas clases?
ReplyDeleteDavid no tan complicado, si trae semaforos y trae un hueco en el código para agregar locks y condicionales no es tan dificl porque apartir de los semaforos podemos crear los locks y lo mismo con las condicionales....
ReplyDeleteDónde consiguieron sus códigos?
ReplyDeleteDiana: Sobre tu duda, encontré que solo invoca una rutina de prueba, es un Thread ya invocado, es decir, no lo creas tú. La prueba es que ya estaba ahí por default hehe.(La ejecución de ese thread se puede apreciar en consola antes de la ejecución de nuestro código).
ReplyDeleteErick: Nosotros solo incluimos nuestro código en threadtest.cc, no creamos ni un archivo más.
ReplyDeleteY después ahí mismo en threadtest.cc mandamos llamar nuestro método start() en la función ThreadTest().
Esteban Sifuentes: En las diapositivas del post anterior (Practical Presentation), en la bibliografía, encontrarás los links de las páginas en donde nos basamos para realizar nuestro código.
ReplyDeleteSaludos a todos :)
Urge lo de syntax highlighter y números de línea. Puntos extra por la discusión para Diana, Everardo, JC y Eduardo.
ReplyDeleteOh JC, esque en la versin de Java la funcion fork de la clase KThread(Thread en c++) no acepta parametros para el fork.
ReplyDeletePero bueno supongo que si es un nombre para el debug, el puntero void me saco de onda, pero bueno ya quedo entendible :)