我有一个使用pthreads的项目; 主线程和子线程以及它们之间的管道.这一切都很好,除非有时它不起作用.子线程运行命令解释器,并且基于ncurses的GUI通过管道向其传送(一些)输入.
我正常创建线程(线程是pthread_t文件范围变量,interp_start是函数)
if (pthread_create(&thread, NULL, interp_start, NULL)) { perror("couldn't create thread"); return; }
Run Code Online (Sandbox Code Playgroud)
然后,如果解释器线程从用户收到"退出"命令,则调用interp_exit
fclose(output);
pthread_exit(NULL);
Run Code Online (Sandbox Code Playgroud)
主线程有一个select(),它检查输出的FD,并调用从FD读取()的函数:
int num=read(interp_output[0], &ch, 1);
if (num==0) shell_done();
if (num==-1) perror("read");
Run Code Online (Sandbox Code Playgroud)
通常可行的预期行为是关闭线程中的FILE*,这使得select()报告准备就绪,这使得read()发生,返回0,调用shell_done().经过一些简单而无关的清理后,这样做:
//fprintf(stderr, "joining thread\n");
pthread_join(thread, NULL);
//fprintf(stderr, "joined\n");
exit(EXIT_SUCCESS);
Run Code Online (Sandbox Code Playgroud)
所有这些有时是段错误.通常很好.如果我取消注释这两个printfs,如果它失败,我得不到(它在pthread_exit中的段错误)或者只是第一个(它在pthread_join中的段错误).
我不会在任何其他方面弄乱"线程",而我只处理空指针.这是怎么回事?我会在其他地方寻找,除非我在这两行之一一直遇到问题 - 甚至在restore_sem_to_pool.我认为它必须是我杀死线程的方式,但我正在做最简单的事情.
提前致谢...