problem zakończenia wątku (programowanie c)

Pracuję nad aplikacją dla Linuksa w C, która używa wielu wątków. Wątki, które są wywoływane przez główną funkcję, wykonują większość pracy i dlatego zwykle kończą się jako ostatnie. Widzę dziwne zachowanie i uważam, że to z powodu głównego wątku kończącego się, zanim zrodzone wątki mają szansę zakończyć swoje zadania. Oto przykładowy kod ilustrujący to, o czym mówię:

#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;
}

Gdy ten kod jest uruchamiany, komunikat z funkcji czyszczenia jest drukowany dwukrotnie, tak jak powinien być, ale innym razem, gdy jest uruchamiany, widzę komunikat drukowany tylko raz, a innym razem widzę go wydrukowany trzy razy lub nie wszystko. Dodajesz w funkcji uśpienia w głównej funkcji, aby grać z tym, jak długo trwa główna funkcja do zakończenia.

Co mogę zrobić, aby program działał tak, jak powinien? Podejrzewam, że ma to coś wspólnego z przyłączeniem się do dzieci, ale nie rozumiem całkowicie pojęcia łączenia lub tego, jak zastosować je do tej sytuacji.

Z góry dziękuję!

questionAnswers(3)

yourAnswerToTheQuestion