У меня есть проект с использованием 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. Я думаю, что это должно быть способом, которым я убиваю нить, но я делаю примерно самую простую вещь из возможных.
Заранее спасибо ...