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)
在您的情况下,该过程本身将是段错误.
如果你要分配NULL,a你可以看到它会在所有可能性中崩溃.在当前代码中,您a以非确定性方式调用.一些随机位置被引用a.因此行为是不确定的.有时您会看到日志语句main,有时程序会崩溃.如果程序在此类执行中崩溃,请认为自己很幸运
如果线程执行NULL指针取消引用,则将占用整个进程.它是一个进程崩溃,而不是一个线程崩溃.
线程大多独立运行,这意味着每个线程都可以使用信号处理程序来捕获“崩溃”信号,而无需杀死其他线程。因此需要添加信号处理程序。
来源:signal-manpage http://man7.org/linux/man-pages/man7/signal.7.html
可以为整个进程(例如,当使用kill(2)发送时)或为特定线程(例如,由于执行而生成的某些信号,例如SIGSEGV和SIGFPE)生成(并因此挂起)信号特定的机器语言指令是线程定向的,就像使用 pthread_kill(3)) 针对特定线程的信号一样。进程控制的信号可以被传递到当前没有阻止该信号的任何一个线程。如果多个线程的信号未被阻塞,则内核会选择任意一个线程来向其传递信号。