void pthread_cleanup_push(void (*routine)(void*), void *arg);
void pthread_cleanup_pop(int execute);//这里的int参数,0是不执行push的内容,非0是执行。
原型很简单,功能跟atexit()差不多,只不过一个是线程一个是进程。
用来设置在push/pop内线程退出时要做的事情。
需要注意的问题有几点:
1,push与pop一定是成对出现的,其实push中包含"{"而pop中包含"}",少一个不行。
2,push可以有多个,同样的pop也要对应的数量,遵循"先进后出原则"。
push进去的函数可能在以下三个时机执行:
1,显示的调用pthread_exit();
或
2,在cancel点线程被cancel。
或
3,pthread_cleanup_pop()的参数不为0时。
以上动作都限定在push/pop涵盖的代码内。
1 #include
2 #include
3 #include
4 #include
5
6 void * thr_fn(void *);
7 void cleanup(void *);
8 int main(int argc,char ** argv)
9 {
10 pthread_t tid;
11 int err;
12 void * tret;
13
14 err=pthread_create(&tid,NULL,thr_fn,NULL);
15 if(err!=0)
16 printf("create thread error: %s\n",strerror(err));
17 err=pthread_join(tid,&tret);
18 if(err!=0)
19 printf("thread join error: %s\n",strerror(err));
20 printf("thread exit code %d\n",(int)tret);
21
22 return 0;
23 }
24 void cleanup(void * arg)
25 {
26 printf("clean : %s\n",(char *)arg);
27 }
28 void * thr_fn(void * arg)
29 {
30 printf("thread push start.\n");
31 pthread_cleanup_push(cleanup,"thread first handler");
32 pthread_cleanup_push(cleanup,"thread second handler");
33 printf("thread push over.\n");
34
35 pthread_exit((void *)1);
36
37 pthread_cleanup_pop(0);
38 pthread_cleanup_pop(0);
39 pthread_exit((void *)2);
40 }
阅读(2272) | 评论(0) | 转发(0) |