problema de terminación de hilo

Estoy trabajando en una aplicación para Linux en C que utiliza varios subprocesos. Los hilos generados por la función principal realizan la mayor parte del trabajo y, por lo tanto, suelen terminar en último lugar. Estoy viendo un comportamiento extraño, y creo que se debe a que el hilo principal termina antes de que los hilos generados tengan la oportunidad de terminar sus trabajos. Aquí hay un código de ejemplo para ilustrar de lo que estoy hablando:

#define _POSIX_C_SOURCE 200112L
#define _ISOC99_SOURCE
#define __EXTENSIONS__
#define _GNU_SOURCE

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

void
my_cleanup(void *arg)
{
     printf("cleanup: %s\n", (char *)arg);
}


void *
thread_stuff(void *arg)
{
     printf("thread started\n");
     pthread_cleanup_push(cleanup, "running");
     if (arg)
          pthread_exit((void *)2);
     pthread_cleanup_pop(0);
     pthread_exit((void *)2);
}


int
main()
{
     int err;
     pthread_t tid1, tid2;

     err = pthread_create(&tid1, NULL, thread_stuff, (void *)1);
     err = pthread_create(&tid2, NULL, thread_stuff, (void *)1);

     sleep(10);                 /* change the value here if you want */

     return SUCCESS;
}

Cuando se ejecuta este código, el mensaje de la función de limpieza se imprime dos veces, como debería ser, pero otras veces cuando se ejecuta, veo el mensaje impreso solo una vez y otras veces lo veo impreso tres veces o no. todos. Usted agrega la función de suspensión en la función principal para jugar con el tiempo que tarda la función principal en terminar.

¿Qué puedo hacer para que el programa se ejecute como debería? Sospecho que tiene algo que ver con unirse a los niños, pero no entiendo completamente el concepto de una unión o cómo aplicarla a esta situación.

¡Gracias por adelantado!

Respuestas a la pregunta(3)

Su respuesta a la pregunta