void *escribir_entero(void*){ rw.wlock(); lockAEscribiendo.rlock(); assert(!alguien_escribiendo); lockAEscribiendo.runlock(); lockALeyendo.rlock(); assert(!alguien_leyendo); lockALeyendo.runlock(); int i = rand() % TAMANIO_ARREGLO; printf("escribiendo_entero = %d \n", i); arreglo[i] += 1; rw.wunlock(); return NULL; }
void *lector(void *p_minumero) { int minumero = *((int *) p_minumero); printf("LECTOR %d QUIERE LEER\n", minumero); lock.rlock(); printf("LECTOR %d LEYENDO\n", minumero); sleep(SLEEP_LECTORES); lock.runlock(); printf("LECTOR %d HA LEIDO\n", minumero); return NULL; }
void *read(void *p_args) { int* args = (int*) p_args; if(args[0] == -1) sleep(args[1]); lock.rlock(); sleep(2); printf("Compartida: %d\n", compartida); lock.runlock(); pthread_exit(NULL); }
void *leer_entero(void*){ rw.rlock(); lockAEscribiendo.rlock(); assert(!alguien_escribiendo); lockAEscribiendo.runlock(); lockALeyendo.wlock(); if (alguien_leyendo) hubo_lectores_simultaneos = true; alguien_leyendo = true; lockALeyendo.wunlock(); int i = rand() % TAMANIO_ARREGLO; printf("leyendo_entero = %d \n", arreglo[i]); lockALeyendo.wlock(); alguien_leyendo = false; lockALeyendo.wunlock(); rw.runlock(); return NULL; }
int enviar_tablero(int socket_fd) { char buf[MENSAJE_MAXIMO+1]; sprintf(buf, "STATUS "); int pos = 7; escribiendo.rlock(); for (unsigned int fila = 0; fila < alto; ++fila) { for (unsigned int col = 0; col < ancho; ++col) { char letra = tablero_palabras[fila][col]; buf[pos] = (letra == VACIO)? '-' : letra; pos++; } } escribiendo.runlock(); buf[pos] = 0; //end of buffer return enviar(socket_fd, buf); }
void* lector(void * arg){ //++++++++++++++ACA CREAMOS UNA BARRERA PARA QUE TODOS LOS THREADS ESPEREN A QUE SEAN TODOS CREADOS pthread_mutex_lock(&mut); while(!todos_creados){ pthread_cond_wait(&barrera, &mut); } pthread_mutex_unlock(&mut); //++++++++++++++++++++++++++++ int yo = (int)(long)arg; lock_valor.rlock(); printf ("mi tid---->%d leo valor:%d\n", yo, valor ); lock_valor.runlock(); pthread_exit(NULL); return NULL; }
void atendedor_de_jugador(int socket_fd) { // variables locales del jugador char nombre_jugador[21]; list<Casillero> palabra_actual; // lista de letras de la palabra aún no confirmada if (recibir_nombre(socket_fd, nombre_jugador) != 0) { // el cliente cortó la comunicación, o hubo un error. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } if (enviar_dimensiones(socket_fd) != 0) { // se produjo un error al enviar. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } cout << "Esperando que juegue " << nombre_jugador << endl; while (true) { // espera una letra o una confirmación de palabra char mensaje[MENSAJE_MAXIMO+1]; int comando = recibir_comando(socket_fd, mensaje); if (comando == MSG_LETRA) { Casillero ficha; if (parsear_casillero(mensaje, ficha) != 0) { // no es un mensaje LETRA bien formado, hacer de cuenta que nunca llegó continue; } // ficha contiene la nueva letra a colocar // verificar si es una posición válida del tablero // PIDO LOCK PARA LECTURA lock.rlock(); if (es_ficha_valida_en_palabra(ficha, palabra_actual) && chequear_palabra_actual(palabra_actual)) { // LIBERO EL LOCK lock.runlock(); palabra_actual.push_back(ficha); //~ tablero_letras[ficha.fila][ficha.columna] = ficha.letra; // ESTO YA NO LO USO // OK if (enviar_ok(socket_fd) != 0) { // se produjo un error al enviar. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } } else { // LIBERO EL LOCK lock.runlock(); //~ quitar_letras(palabra_actual); // ESTO YA NO LO USO palabra_actual.clear(); // ERROR if (enviar_error(socket_fd) != 0) { // se produjo un error al enviar. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } } } else if (comando == MSG_PALABRA) { // PIDO LOCK DE ESCRITURA lock.wlock(); // CHEQUEO QUE TODO ESTE EN ORDEN ANTES DE ESCRIBIR EFECTIVAMENTE (POR SI ALGUIEN ESCRIBIO JUSTO ANTES) if(chequear_palabra_actual(palabra_actual)) { // las letras acumuladas conforman una palabra completa, escribirlas en el tablero de palabras y borrar las letras temporales for (list<Casillero>::const_iterator casillero = palabra_actual.begin(); casillero != palabra_actual.end(); casillero++) { tablero_palabras[casillero->fila][casillero->columna] = casillero->letra; } // LIBERO LOCK DE ESCRITURA lock.wunlock(); palabra_actual.clear(); if (enviar_ok(socket_fd) != 0) { // se produjo un error al enviar. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } } else { lock.wunlock(); // LIBERO LOCK DE ESCRITURA palabra_actual.clear(); // ERROR if (enviar_error(socket_fd) != 0) { // se produjo un error al enviar. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } } } else if (comando == MSG_UPDATE) { // PIDO LOCK DE LECTURA lock.rlock(); if (enviar_tablero(socket_fd) != 0) { // LIBERO LOCK DE LECTURA lock.runlock(); // se produjo un error al enviar. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } // LIBERO LOCK DE LECTURA lock.runlock(); } else if (comando == MSG_INVALID) { // no es un mensaje válido, hacer de cuenta que nunca llegó continue; } else { // se produjo un error al recibir. Cerramos todo. terminar_servidor_de_jugador(socket_fd, palabra_actual); } } }