Я работаю над приложением для Linux в C, которое использует несколько потоков. Нити, которые генерируются основной функцией, выполняют большую часть работы, и поэтому обычно заканчиваются последним. Я вижу какое-то странное поведение, и я считаю, что это связано с тем, что основной поток заканчивается до того, как порожденные потоки смогут закончить работу. Вот некоторые примеры кода, чтобы проиллюстрировать то, что я говорю:проблема завершения нити (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;
}
Когда этот код выполняется, сообщение из функции очистки печатается дважды, как это должно быть, но в других случаях, когда он запускается, я см. сообщение, напечатанное только один раз, и в других случаях я вижу его напечатанным три раза или совсем нет. Вы добавляете функцию сна в основную функцию, чтобы играть с тем, сколько времени требуется для завершения основной функции.
Что я могу сделать, чтобы программа работала так, как должна? Я подозреваю, что это связано с присоединением к детям, но я не совсем понимаю концепцию объединения или как применить его к этой ситуации.
Заранее благодарен!
Это дубликат http://stackoverflow.com/questions/1695106/multiple-threads-in-c-program и http://stackoverflow.com/ Вопросы/1680224/posix-threads-problem - Я бы положил хорошие деньги, это самый часто задаваемый вопрос pthreads (даже если собеседник иногда не знает, что это вопрос, который они задают!) – caf