码迷,mamicode.com
首页 > 其他好文 > 详细

thread_13

时间:2014-09-27 02:19:38      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   ar   sp   div   art   

/*注意:使用取消功能要很注意,很多C库函数(有阻塞性质的)也隐含有取消点,比如sleep(),pthread_cond_wait(),而且,取消线程并不能完全释放线程资源,所以编程的时候尽量不要使用取消功能。
但是,下面这个情况用 异步取消+join 可以达到终止无限循环线程的目的:*/
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <sched.h>
int a = 0;
void *thread1(void *arg)
 {
        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
        do{ 
                a++;
         }while(1);
}       
 int main(int argc, char *argv[])
{
        pthread_t  t1, t2, t3;
        int ret, i;
        printf("main start\n");
        ret = pthread_create(&t1, NULL, thread1, NULL);
        sleep(1);
        pthread_cancel(t1);
        pthread_join(t1, NULL);
        printf("main end, a=%d\n",a);
     return 0;
}    
/*运行结果:
main start
main end, a=294314990*/
/*pthread_cancel
编辑
int pthread_cancel(pthread_t thread)
#include<pthread.h>
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
若是在整个程序退出时,要终止各个线程,应该在成功发送 CANCEL 指令后,使用 pthread_join 函数,等待指定的线程已经完全退出以后,再继续执行;否则,很容易产生 “段错误”。
int pthread_setcancelstate(int state, int *oldstate)
设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为 NULL则存入原来的Cancel状态以便恢复。
int pthread_setcanceltype(int type, int *oldtype)
设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFERRED和 PTHREAD_CANCEL_ASYNCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和 立即执行取消动作(退出);oldtype如果不为NULL则存入原来的取消动作类型值。
此函数应该在线程开始时执行,若线程内部有任何资源申请等操作,应该选择 PTHREAD_CANCEL_DEFERRED 的设定,然后在退出点(pthread_testcancel 用于定义退出点)进行线程退出。
void pthread_testcancel(void)
检查本线程是否处于Canceld状态,如果是,则进行取消动作,否则直接返回。 此函数在线程内执行,执行的位置就是线程退出的位置,在执行此函数以前,线程内部的相关资源申请一定要释放掉,他很容易造成内存泄露。*/

 

thread_13

标签:style   blog   color   io   使用   ar   sp   div   art   

原文地址:http://www.cnblogs.com/leijiangtao/p/3995825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!