Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 成功的pthread_连接后,main()不会终止_C_Pthreads_Pthread Join - Fatal编程技术网

C 成功的pthread_连接后,main()不会终止

C 成功的pthread_连接后,main()不会终止,c,pthreads,pthread-join,C,Pthreads,Pthread Join,我有一个程序,它启动一个pthread,然后在它返回之前等待这个线程的终止。代码类似于: int main(int32_t argc,char*argv[]{ pthread_t; /*初始化和其他东西 ... */ printf(“连接结果:%d\n”,pthread_连接(t,0)); 返回0; } 程序按预期方式打印:连接结果:0。所以连接工作,t完成。然而,程序并没有停止执行。只有在返回0行之前插入命令exit(0)(或其他数字),我才能强制它停止 但是,如果我使用pthread\u

我有一个程序,它启动一个pthread,然后在它返回之前等待这个线程的终止。代码类似于:

int main(int32_t argc,char*argv[]{
pthread_t;
/*初始化和其他东西
... 
*/
printf(“连接结果:%d\n”,pthread_连接(t,0));
返回0;
}
程序按预期方式打印:
连接结果:0
。所以连接工作,t完成。然而,程序并没有停止执行。只有在
返回0
行之前插入命令
exit(0)
(或其他数字),我才能强制它停止

但是,如果我使用
pthread\u join
调用删除该行,则程序将完美地退出

这怎么可能呢?在加入所有子线程后,什么可以阻止程序完成执行

编辑:我刚刚发现gdb告诉我,在执行最后一行
}
后,我得到了一个分段错误。然而,我不知道幕后发生了什么:

Program received signal SIGSEGV, Segmentation fault.
0x000000060003aa10 in ?? ()

我认为主线程中可能发生堆栈损坏。从windows我知道,在执行main之前,exit_进程函数的地址被推送到堆栈上。然后返回0执行退出进程调用。如果堆栈已损坏,则退出进程的指针可能被替换为无效指针。

我在查看手册页时发现:如果多个线程同时尝试与同一线程连接,则结果未定义。如果调用pthread_join()的线程被取消,那么目标线程将保持可连接状态(即,它不会被分离)。有没有可能你正在做这样的事情?@RobertEkendahl,但这不会反映在
printf
的消息中?不管怎样,我只有一个主线程来创建和连接其他线程。我看不出任何明显的原因来解释为什么会出现segfault。你能发布更多的代码吗?@RobertEkendahl我会尝试将代码减少到最低限度,并很快发布。我认为可能是主线程中发生堆栈损坏。从windows我知道,在执行main之前,exit_进程函数的地址被推送到堆栈上。然后返回0执行退出进程调用。如果在您的情况下堆栈已损坏,则可能是指向退出进程的指针被替换为无效指针。