当子线程崩溃和主要等待加入时会发生什么?

时间:2016-10-20 07:21:41

标签: c++ multithreading pthreads

在下面的程序中,我创建了一个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;

}

2 个答案:

答案 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))。可以将过程引导的信号传递给任何信号          其中一个当前没有阻塞信号的线程。          如果多个线程的信号未被阻塞,那么          内核选择一个任意线程来传递信号。