Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porCarmen Moncayo Modificado hace 10 años
1
2007 - Pablo Abrile1 Threads Lenguajes de Programación I
2
2007 - Pablo Abrile2 Objetivos Evolución de la Pila de Registros de Activación en Lenguajes tipo ALGOL con unidades concurrentes Conceptos a recordar de prácticas previas Lenguajes Tipo ALGOL Pila de Registros de Activación Conceptos a introducir Unidades concurrentes (en conjunto con los conceptos previos)
3
2007 - Pablo Abrile3 Lenguajes Tipo ALGOL También llamados Orientados a Pila Programa Ejecutable Datos La Frontera varía en cada instante de la ejecución Heap
4
2007 - Pablo Abrile4 Lenguajes Tipo ALGOL Tienen bloques (fragmentos de programa) Sin nombre Con nombre (funciones) Dentro de estos bloques pueden definirse variables a emplear Al llamar a estos bloques, en la pila de ejecución se crean los registros de activación donde se almacenan las variables que se emplean
5
2007 - Pablo Abrile5 Pila de Registros de Activación Registro de Activación Conjunto de todos los elementos nuevos que necesita un bloque para ejecutarse. Variables Dirección de retorno si llamo a una función (cadena dinámica) Puntero al padre en el árbol de anidamiento (cadena estática)
6
2007 - Pablo Abrile6 Pila de Registros de Activación A → B → B → C → D Programa RA de A RA de B RA de C RA de D
7
2007 - Pablo Abrile7 Pila de Registros de Activación Unidades Concurrentes Programa RA de A RA de B RA de C RA de D Thread 1 Thread 2 …….. Thread n Thread Ppal Variables Globales – Descriptores de archivos – Mem. De Heap - etc.
8
2007 - Pablo Abrile8 Ejercicio Ejemplo Programa Ejecutable #include Headers de la librería POSIX Threads void *XX(void) { int i; printf("%x\n",&i); } Función XX Será llamada desde -Thread creado con pthread_create - Thread Principal (main) int main (){ pthread_t thread; pthread_create(&thread, NULL, XX, NULL); XX(); } Thread Principal Creación del Thread que llamará a XX Invocaciones a XX desde el thread principal
9
2007 - Pablo Abrile9 Salida Esperada XX se llama 4 veces en total 3 desde el main. En adelante Thread Principal 1 desde el thread creado con pthread_create. En adelante Thread 1 Se esperan: 4 impresiones por pantalla ¿Que ocurre con las direcciones de memoria que serán impresas?
10
2007 - Pablo Abrile10 Pilas de Ejecución 1 para el Thread Principal (main) 1 para el Thread 1 (creado por pthread_create)
11
2007 - Pablo Abrile11 XX() (thread principal) Programa XX() Thread 1 Thread Principal i Dirección bfaba8d4 Primer Llamado a XX()
12
2007 - Pablo Abrile12 Programa Thread 1 Thread Principal Al terminar el primer llamado el registro de activación se quita de la pila
13
2007 - Pablo Abrile13 XX() (thread principal) Programa XX() Thread 1 Thread Principal i Dirección bfaba8d4 Segundo Llamado a XX() Se vuelve a apilar en la misma posición
14
2007 - Pablo Abrile14 Programa Thread 1 Thread Principal Al terminar el segundo llamado el registro de activación se quita de la pila
15
2007 - Pablo Abrile15 XX() (thread principal) Programa XX() Thread 1 Thread Principal i Dirección bfaba8d4 Tercer Llamado a XX() Se vuelve a apilar nuevamente en la misma posición
16
2007 - Pablo Abrile16 XX() Thread 1 Programa XX() Thread 1 Thread Principal i Dirección b7e1d3c4 Llamado a XX() Desde el thread creado con pthread_create (Thread 1)
17
2007 - Pablo Abrile17 Salida Esperada bfaba8d4 b7e1d3c4 El orden puede variar de acuerdo a cuando se ejecute el Thread 1 Puede hacerlo entre las llamadas a XX() desde el Thread Principal
18
2007 - Pablo Abrile18 Salida Obtenida
19
2007 - Pablo Abrile19 Orden de aparición alterno Introducimos una demora en la función XX Entre los tres llamados del thread principal a XX se alternará el llamado al thread creado con pthread_create void *XX(void){ int i; for (i=0; i<999999999; i++); //Demora antes de imprimir. printf("%x\n",&i); }
20
2007 - Pablo Abrile20 Salida Debido a la demora, se alternan las salidas El resultado sigue siendo el mismo ya que las pilas de ejecución son separadas para cada thread!! Salida de Thread 1 Salida de main
21
2007 - Pablo Abrile21 Ejercicio 2 2 threads ThreadHola: Imprime Hola ThreadMundo: Imprime Mundo #include void *mensaje(void* msj){ printf("%s\n",msj); } int main (){ pthread_t threadHola,threadMundo; pthread_create(&threadHola, NULL, mensaje, "Hola"); pthread_create(&threadMundo, NULL, mensaje, "Mundo"); } El cuarto argumento de pthread_create es el argumento a pasar a mensaje cuando se crea el thread. En este caso, el mensaje a imprimir por el thread
22
2007 - Pablo Abrile22 Resultado En general, por el poco tiempo de procesamiento que lleva la función “mensaje” se verá la respuesta “Hola” “Mundo” (aunque puede no ser así). Introducimos una demora en la función mensaje para ver si el orden de impresión puede variar
23
2007 - Pablo Abrile23 void *mensaje(void* msj){ int i; for (i=0; i<999999999; i++); //Demora introducida printf("%s\n",msj); }
24
2007 - Pablo Abrile24 Para probar los ejercicios Comprobar que se tienen instaladas las librerías de POSIX threads. Realizar un script “compilar” que contenga gcc $1.c -o $1 –lpthread./compilar 01_threads Compila 01_threads.c./01_threads
25
2007 - Pablo Abrile25 Información de Interés Fork(): Múltiples procesos vs. Threads
26
2007 - Pablo Abrile26 Para mayor información Material disponible en el sitio web de la cátedra http://www.exa.unicen.edu.ar/catedras/lengprg1/
27
2007 - Pablo Abrile27 FIN
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.