pthread_cleanup_push && pthread_cleanup_pop
来源:互联网 发布:怎么上传淘宝宝贝 编辑:程序博客网 时间:2024/05/18 06:07
转载链接:http://blog.myspace.cn/e/407245412.htm
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涵盖的代码内。
前面的2个比较好理解,关键是pthread_cleanup_pop参数问题,其实int那是因为c没有bool,这里的参数只有0与非0的区别,对pthread_cleanup_pop,参数是5和10都是一样的,都是非0。
我们经常会看到这样的代码:
void child(void *t)
{
pthread_cleanup_push(pthread_mutex_unlock,&mutex);
pthread_mutex_lock(&mutex);
..............
pthread_mutex_unlock(&mutex);
pthread_cleanup_pop(0);
}
为啥pthread_cleanup_pop是0呢,他根本就不会执行push进来的函数指针指向的函数,没错,是不执行,真要执行了就麻烦了。
那为啥还得写这句呢?
那是因为push和pop是必须成对出现的,不写就是语法错误。
这么写的目的主要是为了保证mutex一定可以被unlock,因为,在pthread_mutex_lock和pthread_mutex_unlock之间可能发生任何事情,比如,存在N个cancel点导致线程被main或者其他线程给cancel,而cancel动作是不会释放互斥锁的,这样就锁死啦。
通过pthread_cleanup_push加入一个函数pthread_mutex_unlock,参照上面执行时机的说明,在线程被cancel的时候,就可以作释放锁的清理动作。如果线程正常执行,知道运行到pthread_cleanup_pop,那么锁已经被中间代码里的pthread_mutex_unlock给释放了,这时候如果pthread_cleanup_pop的参数不为0,则会再次释放,错就错在这里了,释放了两次。
所以,pthread_cleanup_pop(0)是必须的,因为,首先要成对出现,其次,我们不希望他真的执行到这里释放两次。
0 0
- 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_detach,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学习
- python logger 重写
- NoSql
- Android SDK Manager国内下载缓慢的问题
- java 文字模式调试器jdb使用总结
- mongodb适用和不适用的应用场景
- pthread_cleanup_push && pthread_cleanup_pop
- 最短路径(Dijkstra、Floyd)
- 模板模式随记
- Android之WebView缓存应用
- 最简单的视音频播放示例4:Direct3D播放RGB(通过Texture)
- 整形类型存储机制
- win7 iis install
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 软件方法笔记-5系统用例