70 likes | 216 Views
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información. Aplicaciones Multihilo. Threads. Threads – Introducción. Una aplicación está compuesta por uno o más procesos, los cuales a su vez podrían estar divididos en threads. Aplicación.
E N D
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Aplicaciones Multihilo Threads
Threads– Introducción Una aplicación está compuesta por uno o más procesos, los cuales a su vez podrían estar divididos en threads Aplicación Procesos Threads
Threads– Introducción Dentro del espacio de ejecución de un proceso, los threads funcionan de manera “simultánea” (concurrencia) Todos los threads comparten la información del proceso por encontrarse dentro del mismo. Proceso A Proceso A int a = 33; print a; a = a + 1 a = a - 1 Hilo 1 Hilo 2 Situaciones como esta pueden llevar a codigo no deterministico. El acceso a los recursos debe ser correctamente sincronizado.
Threads– ejemplo 1/2 #include <pthread.h> #include <stdio.h> void *print_fnc( void *ptr ); int p = 5; intmain() { pthread_t thr1, thr2; char *m1 = "Thr1"; char *m2 = "Thr2"; int r1, r2; r1 = pthread_create( &thr1, NULL, print_fnc, (void*) m1); r2 = pthread_create( &thr2, NULL, print_fnc, (void*) m2); pthread_join( thr2, NULL); pthread_join( thr1, NULL); printf("Thread 1 devolvio: %d y el Thread 2: %d\n", r1, r2); }
Threads– ejemplo 2/2 void *print_fnc( void *ptr ) { int i = 0; char *message; message = (char *) ptr; for (i; i<1000; i++) { p = p + 1; printf("%s : %d\n", (char*)message, p); sleep(1); } } Makefile: all: gcc -ggdbthread.c -o thread -lpthread
Threads– ejecución debian:~/c/threads# make gcc -ggdbthread.c -o thread -lpthread debian:~/c/threads# ./thread Thr2 : 6 Thr1 : 7 Thr1 : 8 Thr2 : 9 Thr2 : 11 Thr1 : 10 Thr1 : 12 Thr2 : 13 Thr1 : 14 Thr2 : 15 Thr1 : 16 Thr2 : 16 Thr2 : 17 Thr1 : 17 Thr1 : 18 Thr2 : 19 Thr2 : 20 Thr1 : 21 Thr1 : 22 Noten como el procesador planifica estos hilos según va teniendo disponibilidad. Nada garantiza que se ejecute uno y luego el otro. Situaciones anómalas se pueden producir al no proteger correctamente la sección crítica !!!! !!!!
Threads– sincronización #include <pthread.h> #include <stdio.h> void *print_fnc( void *ptr ); int p = 5; pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; … … void *print_fnc( void *ptr ) { inti = 0; char *message; message = (char *) ptr; for (i; i<1000; i++) { pthread_mutex_lock( &mutex1 ); p = p + 1; pthread_mutex_unlock( &mutex1 ); printf("%s : %d\n", (char*)message, p); sleep(1); } }