线程退出前的资源释放问题

线程退出前的资源释放问题

类似于进程的atexit()函数,线程在退出前也可以执行用户显示定义的一些函数。无论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因为运行出错而退出的情况下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源。


资源独占锁的使用:

线程为了访问临界资源而为其加上锁,但在访问过程中被外界取消,如果线程处于响应取消状态,且采用异步方式响应,或者是在打开独占锁以前的运行路径上存在取消点,在该临界资源将永远处于锁定状态得不到释放。外界取消操作是不可遇见的,因此需要一个机制来化简用于资源释放的编程。


函数pthread_clean_push()/pthread_cleanp_pop()用于自动释放资源

pthread_clean_push(),pthread_cleanp_pop()采用先入后出的栈结构来管理

void pthread_clean_push(void (*routine)(void*),void *arg);
void pthread_cleanp_pop(int execute);

//参数void (*routine)(void*)在调用pthread_clean_push()时压入清理函数栈
//execute表示执行到pthread_cleanp_pop()时,
//是否在弹出清理函数的同时执行函数,为0表示不执行;非0为执行。
//这个参数并不影响异常终止时清理函数的执行

触发routine的3种情况:

  1. pthread_exit( );
  2. pthread_cancel( );
  3. cleanup_pop参数1;

下面这个例子展示了上面两个函数的使用,在此程序中,子线程while(1)死循环,而在主线程中使用pthread_cancel()取消线程

线程退出前的资源释放问题_第1张图片
线程退出前的资源释放问题_第2张图片
这里写图片描述
我们用了pthread_clean_push(),pthread_cleanp_pop()两个函数,当线程被终止时,可以出栈执行我们之前入栈的函数,进行内存释放

你可能感兴趣的:(Linux)