zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    ie7不支持inline-block
    使padding的值不影响整体块的大小
    网页在不同屏幕下的自适应
    CSS:line-height:行高
    用css制作三角形,理解
    js之setTimeOut();
    jQuery:has()和jQuery:contains()区别
    前端开发之jQuary--可见筛选选择器
    python基础知识--10Lambda匿名函数、三元表达式及map、reduce、filter
    python基础知识--9迭代器生成器闭包与装饰器
  • 原文地址:https://www.cnblogs.com/elseliving/p/7895232.html
Copyright © 2011-2022 走看看