首页 > 代码库 > thread_13

thread_13

/*注意:使用取消功能要很注意,很多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 startmain 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