c - pthread_exit(NULL) 段错误

标签 c unix pthreads

我有一个使用 pthreads 的项目;它们之间有主线程和子线程以及管道。一切正常,只是有时不起作用。子线程运行一个命令解释器和一个基于 ncurses 的 GUI 通过管道将(一些)输入穿梭到它。

我正常创建线程(thread 是一个 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 并调用从 FD 读取的函数:

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

通常有效的预期行为是关闭线程中的 FILE*,这使 select() 报告准备就绪,这使 read() 发生,返回 0,调用 shell_done()。在一些简单且无关的清理之后,确实如此:

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

所有这些有时 段错误。通常没问题。如果我取消注释这两个 printfs,如果它失败了,我既不会(它在 pthread_exit 中出现段错误)也不会得到第一个(它在 pthread_join 中出现段错误)。

我不会在任何其他地方搞乱“线程”,我只处理空指针。这是怎么回事?我会寻找其他地方,除非我一直在这两条线之一遇到问题 - 一次甚至在 restore_sem_to_pool。我认为这必须是我终止线程的方式,但我正在做尽可能简单的事情。

提前致谢...

最佳答案

尝试使用 valgrind(特别是“memcheck”部分)。它可以快速帮助您查明运行时的无效内存访问,有时甚至包括未崩溃的程序运行。

关于c - pthread_exit(NULL) 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372584/

相关文章:

c - 内存未释放但仍可访问,是否泄漏?

c - 为什么 C 代码可以在 Win32 构建时工作,但在 x64 构建时失败?

python - 从 C 扩展返回 C 字符串数组

linux - 使用 Sed 删除空格

linux - 如何在创建时复制文件而不在 Unix/Linux 中破坏它

c - 在为该线程评论 pthread_join 时多次执行同一线程子例程

algorithm - 最大单笔销售利润 - 并行版本

c - 如何读取文本文件图像并将其保存到数组中?

c++ - 共享一个平台的部分结构,同时将其他平台的部分结构屏蔽掉

linux - 减少文本文件第四列中的小数