проблема завершения потока (c программирование)

Я работаю над приложением для Linux на C, которое использует несколько потоков. Потоки, порожденные основной функцией, выполняют большую часть работы и поэтому обычно заканчиваются последними. Я наблюдаю какое-то странное поведение, и я полагаю, что это связано с тем, что основной поток прерывается до того, как порожденные потоки имеют возможность завершить свою работу. Вот пример кода, иллюстрирующий то, о чем я говорю:

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

Когда этот код выполняется, сообщение из функции очистки печатается дважды, как и должно быть, но в других случаях, когда оно выполняется, я вижу сообщение, напечатанное только один раз, а иногда я вижу его напечатанным три раза или нет при все. Вы добавляете функцию сна в основную функцию, чтобы играть с тем, сколько времени требуется для завершения основной функции.

Что я могу сделать, чтобы программа работала как надо? Я подозреваю, что это как-то связано с присоединением к детям, но я не совсем понимаю концепцию объединения или как применять его в этой ситуации.

Заранее спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос