LINUX.ORG.RU

pthread_create виснет в дочернем процессе. Помогите!


0

0

Форком создаю дочерний процесс и создаю thread. Thread создается, но главный thread блокируется навсегда! Ядра 2.2.20 и 2.4.17. Попробуйте сами, если не верите:

#include <unistd.h>
#include <pthread.h>

void* threadfunc(void* param) {}
int main() {
pthread_t tid;
if (fork() != 0) exit(0);
pthread_create(&tid, 0, threadfunc, 0); /* HANGS!!! */
pthread_join(tid, 0);
return 0;
}

anonymous

Ответ на: комментарий от anonymous

Да в том то и дело что не возвращает эта функция никакого значения. На ней все останавливается!!

anonymous
()

Интересно а возвращать хотябы NULL из нитевой функции не пробовал? Попробуй - оно то и должно все вылечить ;)

Regards!

tvn
()
Ответ на: комментарий от tvn

2 tnv, а нафига что то возвращать и нити если ее детачнули? и еще, нафига что то возвращать из нити и ожидать что то в родительском потоке(процессе) и тратить на это время, вместо того чтобы выполнять какие либо другие операции в родительском потоке. и если уж так приперло, то результат работы потомка можно (и по-моему лучше) оттображать в глобальных переменных.

anonymous
()

Спокойно собирается и работает. Даже код в threadfunc на ура выполняет :-)))

LamerOk ★★★★★
()
Ответ на: комментарий от anonymous

Нафига возвращать значение из детачнотой нити мне тоже не понятно;), но если в нитевой функции все завершается без return POINTER или pthread_exit(), то иногда получалась описанная ситуация. Лечилось только так;))

Regards!

tvn
()

Я тут немного поразмыслил - попробуй перед exit поставить sleep(10). И скажеш а виснет после такого?

Regards!

tvn
()

вообще-то любая нитевая функция должна заканчиваться return или exit или если нитевая функция типа void то ее нужно заканчивать pthread_exit() инач она так и будет болтаться в памяти а возможно еще и зомби заполучить ;)

anonymous
()

Да какой нафиг зомби. Это же pthread а не fork. А если завершить нить exit'ом то все умрет. Только pthread_exit(NULL);

Dead ★★★★
()
Ответ на: комментарий от Dead

короче ничего не помогает. И sleep(10) тем более. Нить выполняется, а вот создающая нить блокируется на создании. Короче Linux глючет. Надо слать bug-report.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.