pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么

转载 2011年11月25日 16:34:07
 比如thread1: 执行 pthread_mutex_lock(&mutex); //一些会阻塞程序运行的调用,比如套接字的accept,等待客户连接 sock = accept(......); //这里是随便找的一个可以阻塞的接口 pthread_mutex_unlock(&mutex); 这个例子中,如果线程1执行accept时,线程会阻塞(也就是等在那里,有客户端连接的时候才返回,或则出现其他故障),线程等待中...... 这时候线程2发现线程1等了很久,不赖烦了,他想关掉线程1,于是调用pthread_cancel()或者类似函数,请求线程1立即退出。 这时候线程1仍然在accept等待中,当它收到线程2的cancel信号后,就会从accept中退出,然后终止线程,注意这个时候线程1还没有执行: pthread_mutex_unlock(&mutex); 也就是说锁资源没有释放,这回造成其他线程的死锁问题。 所以必须在线程接收到cancel后用一种方法来保证异常退出(也就是线程没达到终点)时可以做清理工作(主要是解锁方面),pthread_cleanup_push与pthread_cleanup_pop就是这样的。 pthread_cleanup_push(some_clean_func,...) pthread_mutex_lock(&mutex); //一些会阻塞程序运行的调用,比如套接字的accept,等待客户连接 sock = accept(......); //这里是随便找的一个可以阻塞的接口 pthread_mutex_unlock(&mutex); pthread_cleanup_pop(0); return NULL; 上面的代码,如果accept被cancel后线程退出,会自动调用some_clean_func函数,在这个函数中你可以释放锁资源。如果accept没有被cancel,那么线程继续执行,当pthread_mutex_unlock(&mutex);表示线程自己正确的释放资源了,而执行pthread_cleanup_pop(0);也就是取消掉前面的some_clean_func函数。接着return线程就正确的结束了。 不晓得你明白没,通俗点就是: pthread_cleanup_push注册一个回调函数,如果你的线程在对应的pthread_cleanup_pop之前异常退出(return是正常退出,其他是异常),那么系统就会执行这个回调函数(回调函数要做什么你自己决定)。但是如果在pthread_cleanup_pop之前没有异常退出,pthread_cleanup_pop就把对应的回调函数取消了, 关于取消点的解释: 比如你执行: printf("thread sleep/n"); sleep(10); printf("thread wake.../n"); 在sleep函数中,线程睡眠,结果收到cancel信号,这时候线程从sleep中醒来,但是线程不会立刻退出。这是应为pthread与C库方面的原因(具体是啥我也不清楚),pthread的建议是,如果一个函数是阻塞的,那么你必须在这个函数前后建立取消点,比如: printf("thread sleep/n"); pthread_testcancel(); sleep(10); pthread_testcancel(); printf("thread wake.../n"); 这样,就添加了两个取消掉。在执行到pthread_testcancel的位置时,线程才可能响应cancel退出进程。 额外的知识:对于cancel信号,线程有两种方法: 忽略,和响应。默认是响应接收到cancel信号,线程有两种处理类型: 立即响应 和 延迟响应(在最近的取消点响应),默认是延迟响应

Hibernate的作用是什么

Hibernate的作用是什么 @ sunRainAmazing 一、在ssh框架中hibernate的作用是什么呢?1、hibernate是一种ORM(对象映射)框架的持久性框架, 它...
  • sunrainamazing
  • sunrainamazing
  • 2017年05月21日 13:30
  • 1820

Jboss的作用是什么?

Boss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器。 因为JBoss代码遵循LGPL许可,你可以在任何商业应用中免费使用它,而不用支付费用。   2006年,Jb...
  • TrueBrightSide
  • TrueBrightSide
  • 2017年01月13日 09:12
  • 2972

jQuery.fn的作用是什么

jQuery.fn的作用是什么: 在自定义jQuery插件中,会经常见到jQuery.fn的身影,下面就简单介绍一下它的作用到底是什么。 想要认识它的本质,最好的办法直接看jQuery的源码,否则...
  • z69183787
  • z69183787
  • 2014年01月02日 21:38
  • 18901

pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么

比如thread1: 执行 pthread_mutex_lock(&mutex); //一些会阻塞程序运行的调用,比如套接字的accept,等待客户连接 sock = accept(......); ...
  • qiaoliang328
  • qiaoliang328
  • 2011年04月27日 22:07
  • 811

pthread_cleanup_push与pthread_cleanup_pop的目的 作用

首先你必须知道pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么。 比如thread1: 执行 pthread_mutex_lock(&mu...
  • slj_win
  • slj_win
  • 2012年02月17日 13:06
  • 8016

线程清理处理函数 pthread_cleanup_push、pthread_cleanup_pop

原文:http://blog.csdn.net/yanook/article/details/6579955 线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立...
  • labrary
  • labrary
  • 2013年05月04日 10:24
  • 518

线程终止方式:pthread_cleanup_push/pthread_cleanup_pop()

以下内容根据【1】进行整理。关于取消点,将在后面进一步讨论。 1、一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中retu...
  • markman101
  • markman101
  • 2011年12月16日 13:46
  • 605

pthread_cleanup_push()/pthread_cleanup_pop()

一、为什么会有pthread_cleanup_push与pthread_cleanup_pop: 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit(...
  • guozhiyingguo
  • guozhiyingguo
  • 2016年11月16日 09:37
  • 123

pthread_cleanup_push与pthread_cleanup_pop的理解

一、为什么会有pthread_cleanup_push与pthread_cleanup_pop: 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit(...
  • u010027547
  • u010027547
  • 2015年09月19日 15:45
  • 613

pthread_cleanup_push和pthread_cleanup_pop学习

pthread_cleanup_push:注册线程退出时的处理程序,与进程的atexit函数类似,只是以压栈的方式储存。 pthread_cleanup_pop:调用已经压栈的线程退出处理程序,当参...
  • wang1902568721
  • wang1902568721
  • 2015年07月03日 23:38
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么
举报原因:
原因补充:

(最多只允许输入30个字)