pthread_exit (NULL) segfaults - PullRequest
       3

pthread_exit (NULL) segfaults

0 голосов
/ 07 декабря 2010

У меня есть проект с использованием pthreads; есть основная нить, дополнительная нить и труба между ними. Все работает нормально, кроме иногда , это не работает. Подпоток запускает интерпретатор команд и основанный на ncurses графический интерфейс челнока (некоторые) вводит по каналу к нему.

Я создаю поток нормально (поток - это переменная области файла pthread_t, interp_start - это функция)

if (pthread_create(&thread, NULL, interp_start, NULL)) { perror("couldn't create thread"); return; }

Затем, если поток интерпретатора получает команду «выхода» от пользователя, он вызывает interp_exit

fclose(output);
pthread_exit(NULL);

Основной поток имеет функцию select (), которая, помимо прочего, проверяет выходной FD и вызывает функцию read () из FD:

int num=read(interp_output[0], &ch, 1);
if (num==0) shell_done();
if (num==-1) perror("read");

Предполагаемое поведение, которое часто работает, заключается в закрытии ФАЙЛА * в потоке, что готовит отчет select (), что приводит к выполнению read (), который возвращает 0, что вызывает shell_done (). Это происходит после некоторой простой и не связанной очистки:

//fprintf(stderr, "joining thread\n");
pthread_join(thread, NULL);
//fprintf(stderr, "joined\n");
exit(EXIT_SUCCESS);

Все это иногда segfaults. Обычно это нормально. Если я раскомментирую эти два printfs, если это не удастся, я не получу ни одного (segfaults в pthread_exit), ни только первого (это segfaults в pthread_join).

Я не связываюсь с 'thread' в любой другой точке, и я имею дело только с нулевыми указателями. В чем дело? Я бы посмотрел в другом месте, за исключением того, что у меня постоянно возникают проблемы в одной из этих двух строк - однажды даже в restore_sem_to_pool. Я думаю, что это должно быть способом, которым я убиваю нить, но я делаю примерно самую простую вещь из возможных.

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

Ответы [ 2 ]

6 голосов
/ 07 декабря 2010

Попробуйте использовать valgrind (в частности, часть "memcheck"). Он может быстро помочь вам определить недопустимые обращения к памяти во время выполнения, иногда даже включая запуски вашей программы, которые не дают сбоя.

0 голосов
/ 07 декабря 2010

Я подозреваю, что это комбинация всего этого, но проблема ушла.Это произошло только тогда, когда я набрал 'quit' слишком рано после запуска программы, но у меня нет времени, чтобы правильно отладить это сейчас, и назначение все равно должно быть выполнено.@Джон - я действительно настраивал valgrind именно для этой цели. [РЕДАКТИРОВАТЬ] Я запускал его раньше, и это не помогло мне с этой проблемой, но я определенно нашел память, которую я не освобождаю [/ EDIT] Всем остальным - я думаю,Вы правы, это, наверное, какая-то порча памяти.@caf - я забыл проверить другой поток ... но я видел проблему в обоих потоках.GDB указывал мне на тот, который на самом деле был segfaulting. [EDIT] Я проверил другие потоки, и он либо ожидал pt_join (если segfault был с pt_exit), либо где-то непосредственно перед pt_exit (если segfault был в pt_join) [/ РЕДАКТИРОВАТЬ]

Голосует за всех, но я не думаю, что будет справедливо принимать ответ здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...