Thread-Beendigungsproblem (C-Programmierung)

Ich arbeite an einer Anwendung für Linux in C, die mehrere Threads verwendet. Die Threads, die von der Hauptfunktion erzeugt werden, erledigen den größten Teil der Arbeit und werden daher normalerweise zuletzt beendet. Ich sehe ein merkwürdiges Verhalten, und ich glaube, es liegt daran, dass der Haupt-Thread beendet wird, bevor die gespawnten Threads die Chance haben, ihre Jobs zu beenden. Hier ist ein Beispielcode, um zu veranschaulichen, wovon ich spreche:

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

Wenn dieser Code ausgeführt wird, wird die Nachricht von der Bereinigungsfunktion zweimal gedruckt, wie es sein sollte. Bei der Ausführung wird die Nachricht jedoch manchmal nur einmal und manchmal dreimal gedruckt alles. Sie fügen in der Hauptfunktion die Sleep-Funktion hinzu, um zu spielen, wie lange es dauert, bis die Hauptfunktion beendet ist.

Was kann ich tun, um das Programm so laufen zu lassen, wie es sollte? Ich vermute, es hat etwas mit dem Beitritt zu den Kindern zu tun, aber ich verstehe das Konzept eines Beitritts oder dessen Anwendung auf diese Situation nicht ganz.

Danke im Voraus!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage