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

转载 2011年04月27日 22:07:00

比如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信号,线程有两种处理类型: 立即响应 和 延迟响应(在最近的取消点响应),默认是延迟响应

pthread_cleanup_push/pop成对出现的意义

首先简单介绍一下这两条API 线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。...
  • yangyiwei524386
  • yangyiwei524386
  • 2014年03月22日 21:41
  • 2037

pthread_cleanup_push与pthread_cleanup_pop的理解

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

pthread_cleanup_push与pthread_cleanup_pop的目的 作用

转自 : http://blog.csdn.net/slj_win/article/details/7267483#reply 首先你必须知道pthread_cleanup_push与pthre...
  • mxgsgtc
  • mxgsgtc
  • 2013年09月22日 16:01
  • 701

pthread_cleanup_push与pthread_cleanup_pop的目的(作用)

比如thread1: 执行 pthread_mutex_lock(&mutex); //一些会阻塞程序运行的调用,比如套接字的accept,等待客户连接 sock = accept(......
  • I_am_JoJo
  • I_am_JoJo
  • 2012年10月08日 11:50
  • 2209

pthread_cleanup_push与pthread_cleanup_pop的作用

首先你必须知道pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么。 比如thread1: 执行 pthread_mutex_lock(&mutex)...
  • talking12391239
  • talking12391239
  • 2013年06月15日 00:30
  • 1159

linux高级编程之线程间的通信(pthread_cleanup_push和pthread_cleanup_pop)

linux高级编程之线程间的通信(pthread_cleanup_push和pthread_cleanup_pop)        线程可以安排他退出时需要调用的函数,这与进程可以用atexit函...
  • longbei9029
  • longbei9029
  • 2017年06月05日 21:43
  • 563

pthread_cleanup_push()/pthread_cleanup_pop()

编译结果: [yk_peng@pengyangkang work]$ gcc test.c -pthread test.c: 在函数‘fn’中: test.c:38:1: 错误:expected ‘w...
  • a627088424
  • a627088424
  • 2015年03月13日 17:01
  • 375

pthread_cleanup_push() pthread_cleanup_pop()

线程终止时的清理 不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解...
  • balderfan
  • balderfan
  • 2012年06月11日 16:09
  • 630

pthread_cleanup_push() & pthread_cleanup_pop()

pthread_cleanup_push() 一般用于线程结束时回调一些函数,push顾名思义向stack中压入一个函数。通过宏展开实现,展开后带有一个{ pthread_cleanup_pop() ...
  • qq_38255689
  • qq_38255689
  • 2017年11月20日 17:28
  • 69

pthread_testcancel,pthread_cleanup_push与pthread_cleanup_pop的作用

比如thread1: 执行 pthread_mutex_lock(&mutex); //一些会阻塞程序运行的调用,比如套接字的accept,等待客户连接 sock = accept(......
  • zjc156m
  • zjc156m
  • 2013年06月04日 13:19
  • 1053
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么
举报原因:
原因补充:

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