ejecución de pthread en linux

4 minutos de lectura

avatar de usuario
Amit Singh Tomar

Empecé a hacer programación pthread en Linux y en el primer programa me confundí totalmente. A continuación se muestra el programa que estoy ejecutando

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

void *print_message_function( void *ptr );

int main(){
 pthread_t thread1, thread2;
 char *message1 = "Thread 1";
 char *message2 = "Thread 2";
 int  iret1, iret2;

/* Create independent threads each of which will execute function */

 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
 iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

 /* Wait till threads are complete before main continues. Unless we  */
 /* wait we run the risk of executing an exit which will terminate   */
 /* the process and all threads before the threads have completed.   */

 pthread_join( thread1, NULL);
 printf("amit");
 pthread_join( thread2, NULL); 

 printf("Thread 1 returns: %d\n",iret1);
 printf("Thread 2 returns: %d\n",iret2);
 exit(0);
}

void *print_message_function( void *ptr ){
 char *message;
 message = (char *) ptr;
 printf("%s \n", message);
}

Lo primero que me gustaría saber es que el orden de ejecución del subproceso no es secuencial.

Lo segundo es que pongo intencionalmente print(“amit”); para ver que main realmente se detiene durante la finalización del subproceso 1, pero en la salida, lo que podemos ver es que la declaración printf se ejecuta primero. La salida de todo el proceso es

Hilo 1

Hilo 2

amitThread 1 devuelve: 0

Tema 2 devuelve: 0

  • “Este orden de ejecución del subproceso no es secuencial”. Eso es correcto. Si encuentra eso lo suficientemente sorprendente como para preguntar aquí, aléjese del código y busque un libro de programación de subprocesos múltiples. Por favor, lea el libro hasta el final. Puede buscar un buen tutorial antes de escribir código más o menos aleatorio. El tema es bastante complejo y no el tipo de cosas que se exploran al azar. computación.llnl.gov/tutorials/pthreads

    – S. Lott

    14 de febrero de 2011 a las 11:15


  • ¿Es esa realmente la salida? da salida ajay en lugar de amit? ¿Cuál es tu pregunta?

    – Falmarri

    14 de febrero de 2011 a las 11:16

  • Gracias @Lott, creo que primero necesito aprender lo básico…

    – Amit Singh Tomar

    14 de febrero de 2011 a las 11:22

  • Y una cosa más en una máquina diferente me está volviendo diferente o/p

    – Amit Singh Tomar

    14 de febrero de 2011 a las 11:36

avatar de usuario
barbilla shawn

Tienes razón al decir que el el orden de ejecución del hilo no es secuencial. Hasta cierto punto, ese es el objetivo de usar subprocesos, es decir, ejecutar otras tareas al mismo tiempo.

El resultado que está viendo es el esperado y posiblemente puede ser diferente.

Quizás esto ayude:

   main            thread1     thread2
    |                
    |--create--------+-----------\
    |                |           |   
    |            "Thread 1"      |   "Thread 2" can
    |                |           |<- occur anywhere
    "https://stackoverflow.com/"   along this line
   join(1) ---------             |
    |                            |
    |                            |
  "amit"                         |
    |                            |
    |                            |
   join(2) ---------------------/
    |
    |
"Thread 1 returns"
"Thread 2 returns"
    |
  exit(0)

La única garantía que tienes es:

  • Thread 1” siempre se imprimirá antes de “amit” (porque pthread_join() espera a que finalice el subproceso 1 antes de que el programa principal pueda continuar)
  • Thread X returns ...” Las declaraciones siempre vendrán al final, después de que ambos subprocesos hayan terminado.

Lo primero que me gustaría saber es que el orden de ejecución del subproceso no es secuencial.

No normalmente. Los subprocesos en la mayoría de los sistemas operativos modernos (las primeras implementaciones de subprocesos en Linux usaban multitarea cooperativa) se ejecutan en paralelo y el orden en que printfs se ejecuta es parcialmente no determinista. los pthread_joins imponer un cierto orden en las cosas, por lo que:

  • Thread 1 debe venir antes Amit porque el subproceso principal espera a que finalice el subproceso 1 antes de imprimir Amit1
  • Thread 2 debe venir antes Thread 1 returns: por el segundo pthread_join. Toda la printfpecado main aparecen en el orden en que aparecen main.

Espero haber respondido a tu pregunta. No estoy completamente seguro de lo que estabas preguntando, pero siéntete libre de pedir aclaraciones sobre cualquier punto.

  • pero lo único que me confundió es por qué printf(“amit”); se ejecuta antes de pthread_join( thread1, NULL); ,se espera??

    – Amit Singh Tomar

    15 de febrero de 2011 a las 6:07

  • @AMIT: el printf("amit") la línea no se llama antes de la pthread_join(thread, NULL) de acuerdo con la salida que publicaste.

    – JeremyP

    15 de febrero de 2011 a las 8:56

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad