exit调用会终止整个进程,在_exit的基础上执行一系列用户空间操作比如刷新缓冲区。_exit是直接交给内核,exit先执行清除操作再交给内核。exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。
因此exit在C++中非线程安全,看下面这个例子:
#include<iostream>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
using namespace std;
void fun(){
exit(1);//###1### 刷新流,析构全局对象,1表示异常返回给调用者,调用者可以根据该值进行相应处理
//_exit(0);//###2### 不会刷新流等,不会析构全局对象
}
class test{
public:
test(){
pthread_mutex_init(&mutex,NULL);
}
void doit(){
pthread_mutex_lock(&mutex);
fun();
pthread_mutex_unlock(&mutex);
}
~test(){
cout<<"~test"<<endl;
pthread_mutex_lock(&mutex);//可能引起死锁
pthread_mutex_unlock(&mutex);
}
private:
pthread_mutex_t mutex;
};
test one;//###3###exit会析构全局对象造成死锁,_exit不会析构全局对象
int main(){
//test one;//###4###局部对象不会被exit/_exit终止析构
one.doit();
}
程序输出:
~test
//出现死锁