一 点睛
POSIX线程库提供了函数pthread_cleanup_push和pthread_cleanup_pop,让线程退出时可以做一些清理工作。这两个函数采用先入后出的栈结构管理,前者会把一个函数压入清理函数栈,后者用来弹出栈顶的清理函数,并根据参数来决定是否执行清理函数。多次调用函数pthread_cleanup_push将把当前栈顶的清理函数往下压,弹出清理函数时,在栈顶清理函数先被弹出。
由pthread_cleanup_push压栈的清理函数在下面3种情况下会执行:
1 线程主动结束,比如return或调用pthread_exit的时候。
2 调用函数pthread_cleanup_pop,且其参数为非0时。
3 线程被其它线程取消时,也就是由其他的线程对该线程调用pthread_cancel函数。
要注意的是,函数pthread_cleanup_push和pthread_cleanup_pop必须成对出现在同一函数中,否则就会出现语法错误。
二 线程主动结束时,调用清理函数
1 代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h> //strerror
void mycleanfunc(void *arg) //清理函数
{
printf("mycleanfunc:%d\n", *((int *)arg)); //打印传进来的不同参数
}
void *thfrunc1(void *arg)
{
int m=1;
print