线程处理函数pthread_cleanup_push / pthread_cleanup_pop
来源:互联网 发布:kettle 大数据 编辑:程序博客网 时间:2024/05/21 07:06
线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。
pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:
1)调用pthread_exit。
2)作为对取消线程请求(pthread_cancel)的响应。
3)以非0参数调用pthread_cleanup_pop。
注意:
1)如果线程只是由于简单的返回而终止的,则清除函数不会被调用。
2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。
名称:
pthread_cleanup_push / pthread_cleanup_pop
功能:
线程清理处理程序
头文件:
#include <pthread.h>
函数原形:
void pthread_cleanup_push(void (*rtn)(void *),void *arg);
void pthread_cleanup_pop(int execute);
参数:
rtn处理程序入口地址
arg传递给处理函数的参数
返回值:
无
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> void cleanup(void *arg){ printf("cleanup: %s/n",(char *)arg); } void *thr_fn1(void *arg){ printf("thread 1 start/n"); pthread_cleanup_push(cleanup,"thread 1 first handler"); pthread_cleanup_push(cleanup,"thread 1 second handler"); printf("thread 1 push complete/n"); if(arg) return ((void *)1); pthread_cleanup_pop(1); pthread_cleanup_pop(1); return ((void *)1); } void *thr_fn2(void *arg){ printf("thread 2 start/n"); pthread_cleanup_push(cleanup,"thread 2 first handler"); pthread_cleanup_push(cleanup,"thread 2 second handler"); printf("thread 2 push complete/n"); if(arg){ pthread_exit((void *)2); } pthread_cleanup_pop(0); //取消第一个线程处理程序 pthread_cleanup_pop(0); //取消第二个线程处理程序 pthread_exit((void *) 2); } int main(void){ int err; pthread_t tid1,tid2; void *tret; err = pthread_create(&tid1,NULL,thr_fn1,(void *)1); if( err != 0){ fprintf(stderr,"create thread1 failed: %s",strerror(err)); exit(1); } err = pthread_create(&tid2,NULL,thr_fn2,(void *)2); if(err != 0){ fprintf(stderr,"create thread 2 failed: %s",strerror(err)); exit(1); } err = pthread_join(tid1,&tret); if(err != 0){ fprintf(stderr,"thread1 join failed: %s",strerror(err)); exit(1); } printf("thread 1 exit code %d/n",(int)tret); err = pthread_join(tid2,&tret); if(err != 0){ fprintf(stderr,"thread2 join failed: %s",strerror(err)); exit(1); } printf("thread 2 exit code %d/n",(int) tret); exit(0); }
补充一下: phtread_cleanup_push 与 phread_cleanup_pop要成对儿的出现,否则会报错!!
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
- 线程退出处理函数 pthread_cleanup_push pthread_cleanup_pop
- 线程清理处理函数 pthread_cleanup_push、pthread_cleanup_pop
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop (二)
- 线程清理函数pthread_cleanup_push / pthread_cleanup_pop
- 程处理函数pthread_cleanup_push / pthread_cleanup_pop
- 线程的清理函数:pthread_cleanup_push / pthread_cleanup_pop
- 线程终止方式:pthread_cleanup_push/pthread_cleanup_pop()
- 线程终止方式:pthread_cleanup_push/pthread_cleanup_pop()
- 5、线程终止方式:pthread_cleanup_push/pthread_cleanup_pop()
- 线程的终止方式:pthread_cleanup_push, pthread_cleanup_pop()
- linux线程,pthread_join和pthread_cleanup_push和pthread_cleanup_pop
- pthread_cleanup_push() pthread_cleanup_pop()
- pthread_cleanup_push() pthread_cleanup_pop()
- ACM学习-POJ-1082-Calendar Game
- 使用VS2010 + VirtualDDK 调试驱动
- 带锁的门__简单题
- 转载新闻 你应该知道的一些 Linux 技巧
- 浏览器添加手机客户端访问
- 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
- iPhone开发中的图像处理相关要点
- Wince6.0 下Camera(OV3640) 驱动开发笔记1——基于S5PC100
- oracle数据库的备份与还原(本地及远程操作)
- 《公司的力量》第三集:猎富时代 解说词
- 网络最大流问题算法 —— Dinic 算法 && poj 1237
- 子类调用父类构造和析构函数的顺序
- 伟大与渺小|心胸与世界
- Linux的inode的理解