Я работаю над приложением для 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;
}
Когда этот код запускается, сообщение из функции очистки печатается дважды, как и должно быть, но в других случаях при его запуске я вижу сообщение, напечатанное только один раз, а иногда я вижу его напечатанным три раза или нет вообще. Вы добавляете функцию сна в основную функцию, чтобы играть с тем, сколько времени требуется для завершения основной функции.
Что я могу сделать, чтобы программа работала должным образом? Я подозреваю, что это как-то связано с присоединением к детям, но я не совсем понимаю концепцию объединения или как применить его в этой ситуации.
Заранее спасибо!