在下面的程序中,我创建了一个pthread_t
thread1,它在函数func()
中崩溃。我对pthread_join
中的main()
命令究竟发生了什么感兴趣。
我在程序下面运行并正常通过打印“完成”退出。我不知道为什么?
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <climits>
#include <cstdio>
#include<pthread.h>
#include <stdlib.h>
using namespace std;
void* func(void *data)
{
cout<<"Calling func"<<(long)(data)<<endl;
int *a;
cout<<a[2]<<endl;
pthread_exit(0);
}
int main( )
{
pthread_t thread1;
pthread_create(&thread1, 0 , &func, (void*)2);
pthread_join(thread1, NULL);
cout<<"complete"<<endl;
}
答案 0 :(得分:5)
在您的情况下,流程本身会出现段错误。
如果您要为a
分配NULL,您可以看到它会在所有可能性中崩溃。在当前代码中,您以非确定性方式调用a
。某些随机位置由a
引用。因此行为是不确定的。有时您会在main
中看到日志语句,有时程序会崩溃。如果程序在此类执行中崩溃,请认为自己很幸运
如果线程执行NULL指针取消引用,则将关闭整个过程。它是一个进程崩溃,而不是一个线程崩溃。
答案 1 :(得分:2)
线程主要是独立运行的,这意味着每个线程都可以使用信号处理程序捕获“崩溃”信号,而不会杀死其他线程。因此需要添加信号处理程序。
来源:signal-manpage http://man7.org/linux/man-pages/man7/signal.7.html
可以为整个过程生成(并因此待决)信号 (例如,使用kill(2)发送时)或特定线程(例如, 某些信号,如SIGSEGV和SIGFPE,生成为 执行特定机器语言指令的结果是 线程定向,以及针对特定线程使用的信号 pthread_kill(3))。可以将过程引导的信号传递给任何信号 其中一个当前没有阻塞信号的线程。 如果多个线程的信号未被阻塞,那么 内核选择一个任意线程来传递信号。