目前,我所知道的linux下进程终止的方式有8种如下,其中1-5为正常终止,6-8位非正常终止:
1,从main函数返回。
2,调用exit。
3,调用_exit 或 _EXIT。
4,最后一个线程从调用函数中返回。
5,最后一个线程调用pthread_exit。
6,调用abort。
7,接收到终止信号终止。
8,最后一个线程对取消请求作出此响应。
进程正常终止时释放资源,这是可预见的,但是异常终止时释放资源则是不可预见的,如一个线程在使用锁的时候异常终止,那么这个锁不及时释放,那么临界资源将一直处于被锁定状态。为了防止这样的事情发生就需要一种机制来解决,pthread_cleanup_push/pthread_cleanup_pop就是为解决这种问题,用于自动释放资源。
pthread_cleanup_push和pthread_cleanup_pop必须成对出现,且之间的程序段的终止都将执行pthread_cleanup_push所指定的清理函数。
函数格式:
pthread_cleanup_push(void (*func),void *arg);
第一个参数为函数指针,传入函数一般为清理函数,是预防进程非正常退出时某些资源没有被释放。第二个参数为第一个参数的传入参数。
pthread_cleanup_pop(0);
参数0表示不会执行pthread_cleanup_push的清除函数。