Pasar al contenido principal

Práctica 1

Versión para impresiónSend by email

Esta práctica muestra el funcionamiento de las hebras. Simplemente hay que compilarlo y ejecutarlo para analizar su funcionamiento.

 


sonido.c - Ejemplo sencillo de creación de hebras en C

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

/* código para escribir la hora cada 1 s */
void *escribir_hora (void* nada) {
  time_t t;
  while(1) {
    t = time(NULL);
    printf("%26s", ctime(&t));
    sleep(1);
  }
}

/* código para emitir un sonido cada 5 s */
void *emitir_sonido (void* nada) {
  while(1) {
    printf("\a");
    sleep(5);
  }
}

/* procedimiento principal */
int main(void) {
  pthread_t hora;	// Una hebra hora
  pthread_t sonido;	// y otra sonido

  pthread_create(&hora, NULL, escribir_hora, NULL);	// hora es el metodo escribir_hora
  pthread_create(&sonido, NULL, emitir_sonido, NULL);	// sonido es el metodo emitir_sonido

  pthread_join(hora,NULL);	// Lanza la ejecucion de hora
  pthread_join(sonido,NULL);	// Lanza la ejecucion de sonido

}				        				        					  

 Ejecución:
 

merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ ls
hebras.c  sonido.c
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ gcc sonido.c -o sonido -lpthread
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ gcc hebras.c -o hebras -lpthread
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ ./sonido
 Tue Jun 12 12:25:16 2012
 Tue Jun 12 12:25:17 2012
 Tue Jun 12 12:25:18 2012
 Tue Jun 12 12:25:19 2012
 Tue Jun 12 12:25:20 2012
 Tue Jun 12 12:25:21 2012
^C
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$

hebras.c - Crea varias hebras y hace una espera a la terminación de cada una de ellas. Cada hebra escribe en un fichero su ID, cada ID segundos.
 

#define _REENTRANT  /* Aseguro que sólo llamo a rutinas reentrantes */
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

#define MAXHEBRAS 100

char** argumentos;             // Puntero a punteros de caracteres (contendra los argumentos)

void *escribe(void *idp) {
  int i, salida;
  char c;
  int id = *(int *)idp;
  if ((salida = open(argumentos[id],                           // Abrimos un archivo con el nombre del argumento
                      O_CREAT | O_WRONLY | O_TRUNC,
0644)) < 0
) { fprintf(stderr, "Error al abrir %s\n", argumentos[id]); pthread_exit("mal"); } for (i=0; i<20; i++) { sleep(id); c= 'A'+id-1; write(salida, &c, 1); // E imprimimos en el archivo cada id segundos } pthread_exit("bien"); } int main(int argc, char* argv[]) { int i; pthread_t hebra[MAXHEBRAS]; // Un array de MAXHEBRAS hebras int id[MAXHEBRAS]; // Un array de ids para las hebras char *estado; // Puntero a caracter argumentos= argv; for (i=1; i<argc; i++) { id[i-1] = i; // Asignamos los identificadores de hebra if (pthread_create(&hebra[i-1], NULL, escribe, &id[i-1]) != 0) { // y creamos las hebras, con el método escribe fprintf(stderr, "Error al crear hebra\n"); // e id con su número de id como parámetro exit(1); // si falla, sacamos el error y nos salimos } } for (i=1; i<argc; i++) { pthread_join(hebra[i-1], (void**)&estado); // Para el numero de argumentos menos 1 (la propia llamada) printf("Terminada %s la hebra %d\n", estado, i); // esperamos a que termine e imprimimos un mensaje indicando su fin } exit(0); }

Ejecución:
 

merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ ls
hebras  hebras.c  sonido  sonido.c
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ ./hebras test1.txt test2.txt
Terminada bien la hebra 1
Terminada bien la hebra 2
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ ls
hebras  hebras.c  sonido  sonido.c  test1.txt  test2.txt
merlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ cat test1.txt
AAAAAAAAAAAAAAAAAAAAmerlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$ cat test2.txt
BBBBBBBBBBBBBBBBBBBBmerlin@merlin-MacBookAir:~/Escritorio/LPRS/Practicas/1$

 

Resultados Pedidos:

Explicación del funcionamiento de los dos programas, comparando el último con el de la práctica de procesos de Arquitectura (https://moodle.lab.dit.upm.es/moodle/file.php/31/practicas/p/procesos/procesos.html).

sonido.c - Crea dos hebras. La primera de ellas es un bucle infinito que cada segundo imprime la hora, la segunda es otro bucle infinito, que imprime \a cada 5 segundos lo que hace sonar un aviso.

hebras.c - Crea tantas hebras como cantidad de argumentos tiene la ejecución menos uno (el propio argumento de la función hebras). Cada hebra escribe cada "ID de la hebra" segundos una letra identificadora en el archivo hasta 20 y sale, y el proceso principal espera la terminación de todas las hebras e imprime un mensaje informando de su terminación.

En el código de ARQO se creaban procesos, no hebras y se esperaba a la terminación del proceso con el pid determinado.

AdjuntoTamaño
sonido.c1.16 KB
hebras.c1.23 KB