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



原文地址:https://www.cnblogs.com/elseliving/p/7895232.html