设为首页 收藏本站
查看: 2241|回复: 6

[经验分享] unix 线程回调函数使用-pthread_cleanup_push && pthread_cleanup_pop

[复制链接]

尚未签到

发表于 2013-1-16 09:24:31 | 显示全部楼层 |阅读模式
  • [Shell] 纯文本查看 复制代码
    #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; 
    } 


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-3196-1-1.html 上篇帖子: unix系统编程小结(一)------文件I/O 下篇帖子: 用户、组的管理常用到的命令介绍

尚未签到

 楼主| 发表于 2013-1-16 09:24:45 | 显示全部楼层

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-15 17:25:56 | 显示全部楼层
不错不错,楼主您辛苦了。。。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-16 06:52:13 | 显示全部楼层
走自己的路,让别人打车去吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-17 01:15:13 | 显示全部楼层
你的丑和你的脸没有关系。。。。。。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-17 15:11:53 | 显示全部楼层
生我之前谁是我,生我之后我是谁?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-18 06:55:25 | 显示全部楼层
商女不知亡国恨、妓女不懂婚外情。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表