• 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



  • 相关阅读:
    一步一步自定义SpringMVC参数解析器
    Git客户端TortoiseGit(Windows系统)的使用方法
    Tiles入门和Tiles 框架和体系结构
    SpringMVC整合Tiles框架
    JQuery和JSON方式参数传递并处理JAVAWEB中文乱码问题
    spring mvc接收JSON格式的参数
    Spring MVC Controller与jquery ajax请求处理json
    扩展SpringMVC以支持绑定JSON格式的请求参数
    SpringMVC从Control中响应json数据
    JSONP 教程
  • 原文地址:https://www.cnblogs.com/elseliving/p/7895232.html
Copyright © 2020-2023  润新知