今天看了对这两个函数的英文版描述,自己懂了,但在网上看了一些资料,觉得理解更深刻了,现在分享给大家,由于我的水平有限,所以很感谢我参考资料的所有牛人。

函数原型void pthread_cleanup_push(void (*routine)(void *),void * arg)

其中routine是一个函数指针,指向一个自定义的清理函数,arg是传给清理函数的参数,该函数用来将一个函数压入(或者注册)到一个清理函数栈的顶端。

函数原型 void pthread_cleanup_pop(int execute);

其中参数 execute为0时,移除pthread_cleanup_push()压入(或者叫注册)的清理函数,当为非零时,表示执行pthread_cleanup_push()压入(或者叫注册)的清理函数。

在以下3种情况下会执行这两个函数注册的清理函数:

(1)当一个线程被取消时,这些清理函数会以与push注册时相反的顺序被执行,且执行后被从栈中移除

(2)通过调用函数pthread_exit()终止线程时,这些清理函数被调用,但是如果用return语句来终止线程,则不会调用这些清理函数

(3)当调用pthread_cleanup_pop()函数且其参数为非零时,就调用栈顶的清理函数执行,且执行完后,就将该清理函数从栈中移除

注意:

(1)对函数pthread_cleanup_push()和函数pthread_clean_up()的调用必须成对出现,否则编译出错,这是因为POSIX标准允许以宏的方式实现这两个函数,这就意味着phread_cleanup_push()函数包含'{',而pthread_cleanup_pop()函数包含'}';

(2)phread_cleanup_push()函数可以有多个,同时pthread_cleanup_pop()函数有对应相同个,遵循“先进后出”原则。