欢迎光临散文网 会员登陆 & 注册

线程 (4)线程清理函数

2022-09-25 11:32 作者:GXTon_阿通  | 我要投稿

进程中有一个函数 atexit() ,使用它可以注册进程终止处理函数.
当调用 exit() 退出的时候,就会执行进程终止处理函数.
线程也有一个类似的功能,叫做"线程清理函数"( thread cleanup handler).

线程的清理函数可以注册多个(进程只能注册一个).
每个线程都拥有一个清理函数栈,这些函数都记录在栈中,栈是一种先进先出的数据结构.
也就是它们执行顺序与注册顺序相反.当执行完所有的清理函数后,线程终止.

那么,如何向线程的栈中添加和删除"清理函数".

这个清理函数设置好了,
就等线程退出后,触发执行了.
下面几种情况下,"清理函数"会被触发执行:
1,线程调用 pthread_exit() 退出时;
2,线程响应取消请求时;
3,用非0参数调用 pthread_cleanup_pop();

举例:
虽然 pthread_cleanup_push() 和 pthread_cleanup_pop() 都定义成了函数形式,
但是,其都是宏定义, 类似于括号{ }的左右边,所以这两个需要配合成对使用!!!
需要成对使用,最好编程的时候要在一个函数里,成对调用,分开用,就容易丢...

运行代码:

可以编写一个makefile 或者直接 gcc执行.
1,直接gcc执行:

2,另一种执行方法 : 编写 makefile 然后 make

makefile内容:

执行效果:

pthread_cleanup_push() 和 pthread_cleanup_pop()
虽然有点类似钩子函数,
但比钩子函数好的是,可以进行干预,可以取消某个.在pop中传入(0)就不会调用.


如果不成对,就会报错,
报错可能会出现在main的结尾处或者开始处的大括号部分.
如果是这样,绝大多数是因为语法错误.比如分号错误,大括号不匹配.


为什么这两个函数是宏,可以用 gcc main.c -E 查看上述代码,就可以看到预处理后的代码.

-E就是展开的意思...

线程 (4)线程清理函数的评论 (共 条)

分享到微博请遵守国家法律