• pthread_cancle并不能结束线程


    将仅仅使用pthread_cancle的函数修改为如下:   

    pthread_mutex_lock(&thread_mutex);
        if( 0 != pthread_cancel(thread_tbl[taskID].thread_id) )
        {
            printf("[%s] pthread_cancel fail! ",__FUNCTION__);
            pthread_mutex_unlock(&thread_mutex);
            return XP_RET_ERROR;        
        }
        if( 0 != pthread_join(thread_tbl[taskID].thread_id,NULL) )
        {
            printf("[%s] pthread_join fail! ",__FUNCTION__);
            perror(" pthread_join fail!");
            pthread_mutex_unlock(&thread_mutex);
            return XP_RET_ERROR;        
        }    
        pthread_mutex_unlock(&thread_mutex);
        return XP_RET_OK;

    http://blog.csdn.net/mengxingyuanlove/article/details/50791368
    http://blog.csdn.net/dinghqalex/article/details/42921931
    http://blog.csdn.net/cry1994/article/details/53483524
    http://blog.csdn.net/huangshanchun/article/details/47420961


    二、为什么要使用pthread_join()
            在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到pthread_join()方法了。
            即pthread_join()的作用可以这样理解:主线程等待子线程的终止。也就是在子线程调用了pthread_join()方法后面的代码,只有等到子线程结束了才能执行。

    开头说明一句:使用pthread_cancel是一个丧心病狂的想法。
    首先是常识
    pthread_cancel(thread)会发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
    若是在整个程序退出时,要终止各个线程,应该在成功发送 CANCEL 指令后,使用 pthread_join 函数,等待指定的线程已经完全退出以后,再继续执行;否则,很容易产生 “段错误”。


    linux下pthread_cancel无法取消线程的原因:
    一个线程可以调用pthread_cancel终止同一进程中的另一个线程,但是值得强调的是:同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检测是否需要取消当前线程。被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1。


    pthread_join函数:
    函数原型:int pthread_join(pthread_t tid, void **status);

    功能:pthread_join()函数会一直阻塞调用线程,直到指定的线程tid终止。当pthread_join()返回之后,应用程序可回收
    与已终止线程关联的任何数据存储空间,(另外也可设置线程attr属性,当线程结束时直接回收资源)如果没必要等待特定的线程
    终止之后才进行其他处理,则应当将该线程分离pthread_detach()。

    头文件:#include <pthread.h>
    pthread非linux系统的默认库, 需手动链接-线程库 -lpthread



  • 相关阅读:
    使用 connect http proxy 绕过 ssh 防火墙限制
    Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案
    Mac 下 Chrome 浏览器 ERR_NETWORK_CHANGED 报错解决方案
    SCSS & SASS Color 颜色函数用法
    eggjs 框架代理调试 SELF_SIGNED_CERT_IN_CHAIN 报错解决方案
    【转】谷歌安装Axure浏览器插件
    js 图片转base64并压缩
    ajax请求
    postman如何重置账号的密码
    解决url中&times会被转成×的问题
  • 原文地址:https://www.cnblogs.com/elseliving/p/7895232.html
Copyright © 2020-2023  润新知