读书人

多线程设计之线程清算pthread_cleanup

发布时间: 2013-01-26 13:47:03 作者: rapoo

多线程设计之线程清理pthread_cleanup

线程清理:pthread_cleanup_push() & pthread_cleanup_pop()

A cancellation clean-up handler is poppedfrom the stack and executed in

The following circumstances:(三种情况会执行线程清理)

1. When a thread is canceled, allof the stacked clean-up handlers are popped and executed in the reverse of theorder in which they were pushed onto the stack. (线程取消)

2. When a thread terminates bycallingpthread_exit(3),all clean-up handlers are executed as described in the preceding point. (Clean-up handlers are not called if thethread terminates by performing a return from the thread start function.) (push与pop之间执行了pthread_exit)

3. When a thread calls pthread_cleanup_pop()with a nonzero execute argument, the top-most clean-up handler is popped andexecuted.(pop内为非零参数)

示例代码:

/*

*pthread_push_pop.c

*

* Created on: Jan 21, 2013

* Author: linuxdba@qq.com

*/

#include <stdio.h>

#include <pthread.h>

void *clean1(void *arg)

{

printf("clean1func: %s\n", arg);

return(void *)0;

}

void *clean2(void *arg)

{

printf("clean2func: %s\n", arg);

return(void *)0;

}

void *thread(void )

{

pthread_tthid;

thid= pthread_self(); //获取线程ID

printf("thethread is: %d.\n",thid);

printf("theprocess id is: %d.\n", getpid()); //进程ID

pthread_cleanup_push((void*)clean1,"first push");

pthread_cleanup_push((void*)clean2, "second push");

printf("Inthread.\n");

pthread_exit("threadexit.\n"); //退出线程,会执行push指定函数

/*return NULL; */ //不会执行push指定函数

pthread_cleanup_pop(0);//为0,只有在异常退出时才会执行push指定的函数,pop第一个

pthread_cleanup_pop(1);//为非0,即便是正常,也会执行push指定的函数,pop第二个

returnNULL;

}

int main(int argc, char argv[])

{

intret = 0;

pthread_tpthid;

ret= pthread_create(&pthid, NULL,(void *)thread,NULL);

if(ret)

{

printf("createthread failed.\n");

return-1;

}

printf("theprocess is: %d.\n", getpid()); //获取进程ID

pthread_join(pthid,NULL);

}

运行结果:

the process is: 3893.

the thread is:1738999552.

the process id is: 3893.

In thread.

clean2 func: second push

clean1 func: first push

push与pop采用栈方式,先进后出,后进先出,所以clean2会在前面。

需要注意的几点:

1) 线程属于进程的,只有一个进程ID,一样的;

2) push和pop是采用栈方式;

3) pthread_cleanup_pop后面为0则执行push指定函数,非0则即便正常也执行

4) push与pop之间代码若异常退出,包括pthread_exit,会进行相应的函数处理,但是若其间执行了return,则直接结束线程,不执行push指定函数。

参考文档:

http://man7.org/linux/man-pages/man3/pthread_cleanup_push.3.html

读书人网 >软件架构设计

热点推荐