Pthread学习笔记(3) 线程清理
pthread_cleanup_push和pthread_cleanup_pop
函数原型如下:
void pthread_cleanup_push(void (*routine)(void *),void *arg)
void pthread_cleanup_pop(int execute);
相关解释
在线程取消时需要对线程进行清理,释放资源,比如释放锁之类。
pthread_cleanup_push()函数会将routine这个函数压入栈顶(这个栈是用于存放清理函数),并且arg是作为routine函数的参数。
pthread_cleanup_pop()函数会将清理函数栈顶的函数弹出。
在push和pop之间,如果线程被取消例如pthread_cancel(),或者线程调用pthread_exit()终止时会将函数依次弹出,并按弹出顺序(所以是跟入栈顺序相反)执行函数。
如果pthread_cleanup_pop()函数的参数非0,那么在pop时也会执行该函数。
使用
push和pop一定要成对使用,可以理解成{和}的关系,少了编译会报缺少{}的错。
pthread_exit退出线程
如下程序,在子线程func中依次压入clean1和clean2函数,调用pthread_exit(0)终止。
#include<stdio.h>
#include<pthread.h>
pthread_t pt;
void clean1(void* arg)
{
printf("This is clean1.\n");
}
void clean2(void* arg)
{
printf("This is clean2.\n");
}
void* func(void* arg