unix 线程回调函数使用-pthread_cleanup_push && pthread_cleanup_pop
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,#if 0线程结束时清理函数pthread_cleanup_push(),应该在线程开始的时候尽快执行初始化pthread_cleanup_pop(),当遇到以下三种各件会自动调用该函数,不需要PC执
千家信息网最后更新 2025年12月01日unix 线程回调函数使用-pthread_cleanup_push && pthread_cleanup_pop
- #if 0
- 线程结束时清理函数
- pthread_cleanup_push(),应该在线程开始的时候尽快执行初始化
- pthread_cleanup_pop(),当遇到以下三种各件会自动调用该函数,不需要PC执行到此函数
- 1.调用pthread_exit()
- 2.响应取消请求例如pthread_cancel()
- 3.当pthread_cleanup_pop(arg)参数arg为非0时会线程退出时自动执行
- 如果没有以上三种情况,则不会执行;
- #endif
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <semaphore.h>
- sem_t sm0,sm1,sm2,sm3; //信号量定义 信号量为控制线程的执行
- void ret_fn(void*str)//线程退出调用的回调函数
- {
- fputs(str,stdout);
- }
- void thread0(void)
- {
- if(0 != sem_wait(&sm0))//信号量进行阻塞
- {
- perror("sem_wait_0");
- }
- char *str = "thead0_return_FN is runing\n";
- pthread_cleanup_push(ret_fn,str);//将回调函数入栈
- fputs("thread0 is runing\n",stdout);
- pthread_cleanup_pop(0);//将回调函数出栈,当遇到特定的条件会自动调用,不需要PC指到此才执行
- return;
- }
- void thread1(void)
- {
- if(0 != sem_wait(&sm1))
- {
- perror("sem_wait_1");
- }
- char *str = "thead1_return_FN is runing\n";
- pthread_cleanup_push(ret_fn,str);
- fputs("thread1 is runing\n",stdout);
- pthread_exit((void*)1);
- pthread_cleanup_pop(0);
- }
- void thread2(void)
- {
- if(0 != sem_wait(&sm2))
- {
- perror("sem_wait_2");
- }
- char *str = "thead2_return_FN is runing\n";
- pthread_cleanup_push(ret_fn,str);
- fputs("thread2 is runing\n",stdout);
- pthread_cleanup_pop(1);
- fputs("线程结束才会执行pthread_cleanup_pop\n",stdout);//线程结束才会执行pthread_cleanup_pop
- }
- void thread3(void)
- {
- char *str = "thead3_return_FN is runing\n";
- pthread_cleanup_push(ret_fn,str);
- if(0 != sem_wait(&sm3))
- {
- perror("sem_wait_3");
- }
- fputs("thread3 is runing\n",stdout);
- usleep(100);// 让主线程中的pthread_cancel可以执行
- pthread_cleanup_pop(0);
- }
- int main(void)
- {
- pthread_t thd0,thd1,thd2,thd3;
- if(0 != sem_init(&sm0,0,0))//初始化信号量
- {
- perror("sem_init_0");
- exit(1);
- }
- if(0 != sem_init(&sm1,0,0))
- {
- perror("sem_init_0");
- exit(1);
- }
- if(0 != sem_init(&sm2,0,0))
- {
- perror("sem_init_0");
- exit(1);
- }
- if(0 != sem_init(&sm3,0,0))
- {
- perror("sem_init_0");
- exit(1);
- }
- if(0 != pthread_create(&thd0,NULL,(void*)thread0,NULL))//创建线程
- {
- perror("pthread_create_0\n");
- exit(1);
- }
- if(0 != pthread_create(&thd1,NULL,(void*)thread1,NULL))
- {
- perror("pthread_create_1\n");
- exit(1);
- }
- if(0 != pthread_create(&thd2,NULL,(void*)thread2,NULL))
- {
- perror("pthread_create_2\n");
- exit(1);
- }
- if(0 != pthread_create(&thd3,NULL,(void*)thread3,NULL))
- {
- perror("pthread_create_3\n");
- exit(1);
- }
- unsigned char status = 0xF;//控制重复测试掩码
- while(1)
- {
- fputs("请输入测试选项:0(没有调用回调函数),1(pthread_exit),2(pthread_cancel),3(参数非0 pthread_cleanup_pop)\n",stdout);
- int in;
- scanf("%d",&in);
- switch(in)
- {
- case 0:
- {
- if(!(status & 0x1))
- {
- fputs("这个项目已测试过,请选择其它,谢谢\n",stdout);
- break;
- }
- if(0 != sem_post(&sm0))//激活信号量,让子线程THD0继续执行
- {
- perror("sem_post_0\n");
- }
- status &= 0xe;
- break;
- }
- case 1:
- {
- if(!(status & 0x2))
- {
- fputs("这个项目已测试过,请选择其它,谢谢\n",stdout);
- break;
- }
- if(0 != sem_post(&sm1))
- {
- perror("sem_post_1\n");
- }
- status &= 0xc;
- break;
- }
- case 2:
- {
- if(!(status & 0x4))
- {
- fputs("这个项目已测试过,请选择其它,谢谢\n",stdout);
- break;
- }
- if(0 != sem_post(&sm2))
- {
- perror("sem_post_2\n");
- }
- status &= 0xb;
- break;
- }
- case 3:
- {
- if(!(status & 0x8))
- {
- fputs("这个项目已测试过,请选择其它,谢谢\n",stdout);
- break;
- }
- if(0 != sem_post(&sm3))
- {
- perror("sem_post_3\n");
- }
- pthread_cancel(thd3);
- status &= 0x7;
- break;
- }
- default: break;
- }
- sleep(1);
- }
- return 0;
- }
线程
函数
测试
信号
信号量
项目
选择
参数
控制
情况
时候
条件
激活
上三
输入
阻塞
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
国内免费mysql数据库
数据库中的时间验证规则怎么做
苏州软件开发平均薪资
sql安装 数据库引擎失败
贵州超杰网络技术有限公司
北邮学生数据库
网络安全领域境外学术交流
阿里巴巴云数据服务器数据热转移
Linux服务器去访问
联想服务器如何做raid
网络安全宣传周课件
网络安全设计到哪些方面
专利数据库检索作业
思科交换机路由器服务器怎么联通
rdf三元组数据库
计算机网络安全实验题
江西计算机网络技术学校哪家好
新泰app软件开发
如何给软件开发插件
天文台服务器运维
cod先锋连不上服务器
向数据库数据插入自增数
网络技术员岗位实习内容
数据库中存图片6
酷播高清服务器
wifi的网络安全性高不高
数据库的完整性为
火绒安全服务器异常修复就闪退
奉贤区新能源软件开发费用
廊坊市吉创网络技术有限公司