取消进程释放资源
来源:互联网 发布:材料 光电 考研 知乎 编辑:程序博客网 时间:2024/05/18 03:53
的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式,在这种方式下使用pthread_join(非分离方式),或在detach方式下系统都能正常回收资源;非正常终止是线程在其他线程的干预下(比如使用pthread_cancel的异步方式使线程退出),或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。
弹出处理函数。
如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源或信号量资源,就是一个必须考虑解决的问题。
为此,系统提供了两个函数。
void pthread_cleanup_push(void (*routine) (void *), void *arg)void pthread_cleanup_pop(int execute)从push和pop两个关键字看,这两个函数采用栈管理的方式。
在线程初始执行时,用pthread_cleanup_push()压入清理函数void routine(void *arg),这个函数可以多次执行以压入多个函数形成函数链,而执行的顺序与压入顺序相反。
在线程结束时,用 pthread_cleanup_pop弹出清理函数,参数execute表示弹出清理函数时,是否执行该清理函数。为0表示不执行,为非0表示执行。这个参数不影响异常终止时清理函数的执行,就是说如果程序异常退出,清理函数照常执行。
实例:
仅有一台打印机,要求有新任务到来时即刻停止正在打印的任务,启动新任务
涉及资源独占,使用信号量sem_wait(&avail); 也可以使用pthread_mutex_lock(&mut)来同步。
在主线程中使用pthread_create创建线程,为了主线程不阻塞,使用pthread_detach分离线程。
在子线程中, sem_wait等待获取资源。
使用
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
设置线程可被异步取消。
使用
pthread_cleanup_push(clean_fun,0);设置清理函数。
在子线程结束处,
pthread_cleanup_pop(0);
弹出处理函数。
在主线程中,可以用sem_trywait判断当前是否有线程在打印。
参考 http://www.cnblogs.com/hnrainll/archive/2011/04/20/2022149.html
http://blog.csdn.net/caianye/article/details/5912172
0 0
- 取消进程释放资源
- 完全释放Excel进程的资源
- 资源释放
- 释放资源
- 释放资源
- 释放资源
- 释放资源
- 释放资源
- 资源释放
- 如何完全杀掉带锁的进程并释放资源
- Silverlight 操作Excel 中的进程资源释放问题
- Android 释放资源和进程的优先级顺序
- linux进程退出,线程资源用pthread_detach释放
- 正确释放资源方法
- 线程资源释放
- Delphi释放资源
- 如何手工释放资源
- 释放C#资源
- quick-cocos2d-x 脚本和资源加密
- leetcode: Contains Duplicate II
- 正则表达式、反射
- poj解题报告——1350
- 骑士cms最新全局SQL注入(官方奇葩修复案例)
- 取消进程释放资源
- HTTP与HTTPS的区别
- hdu 1711 Number Sequence(kmp)
- 判断ip地址是否合法的函数
- 一些牛人的IOS博客,mark下慢慢学习
- poj 1469 COURSES 二分图最大匹配 匈牙利算法
- Andorid 加固逆向分析
- 最新iOS判断手机号码是否正确正则表达式
- JavaScript (三)