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

Emp*_*ata 9 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;

}
Run Code Online (Sandbox Code Playgroud)

Pra*_*bhu 7

在您的情况下,该过程本身将是段错误.

如果你要分配NULL,a你可以看到它会在所有可能性中崩溃.在当前代码中,您a以非确定性方式调用.一些随机位置被引用a.因此行为是不确定的.有时您会看到日志语句main,有时程序会崩溃.如果程序在此类执行中崩溃,请认为自己很幸运

如果线程执行NULL指针取消引用,则将占用整个进程.它是一个进程崩溃,而不是一个线程崩溃.


Dom*_*mso 2

线程大多独立运行,这意味着每个线程都可以使用信号处理程序来捕获“崩溃”信号,而无需杀死其他线程。因此需要添加信号处理程序。

来源:signal-manpage http://man7.org/linux/man-pages/man7/signal.7.html

可以为整个进程(例如,当使用kill(2)发送时)或为特定线程(例如,由于执行而生成的某些信号,例如SIGSEGV和SIGFPE)生成(并因此挂起)信号特定的机器语言指令是线程定向的,就像使用 pthread_kill(3)) 针对特定线程的信号一样。进程控制的信号可以被传递到当前没有阻止该信号的任何一个线程。如果多个线程的信号未被阻塞,则内核会选择任意一个线程来向其传递信号。