pthread_cancel杀死线程有条件
杀死进程我们有kill指令和kill函数,且进程是依靠信号来杀死进程的,但是线程不同,杀死线程我们用到pthread_cancel函数,它不是依靠信号来杀死线程的。
pthread_cancel():杀死线程
参数:只有一个参数,需要被杀死线程的id。
注意:pthread_cancel函数只是告诉内核,该线程需要被杀死,但是如果线程不进行系统调用,没有用户态到内核态的切换,即没有进入到内核区,则pthread_cancel函数将无法杀死该线程。
代码1:杀死进入内核区的线程
#include
void* fun(void* arg)
{//如果该线程不被pthread_cancel杀死则一直打印“hello world”while(1){printf("hello world\n");//printf打印需要进行系统调用,进入内核区sleep(1);//防止打印太快}pthread_exit(NULL);
}
int main()
{pthread_t pth;//创建线程pthread_create(&pth,NULL,fun.NULL);sleep(5);//杀死fun线程。pthread_cancel(pth);pthread_exit(NULL);
}
执行结果:一直打印“hello world”
代码2:杀不死不进入内核去的线程
#include
void* fun(void* arg)
{while(1){//只是让线程不结束,不进行系统调用,不进入内核区}pthread_exit(NULL);
}
int main()
{pthread_t pth;//创建线程pthread_create(&pth,NULL,fun.NULL);sleep(5);//杀死fun线程。pthread_cancel(pth);pthread_exit(NULL);
}
执行结果:杀不死线程,fun线程一直处于运行状态。
问:如果线程不进入内核是不是就没有办法杀死它了呢???
答:不是,我们可以让线程执行函数pthread_testcancel();这样我们的pthread_cancel就可以杀死它了。
#include
void* fun(void* arg)
{while(1){pthreadd_testcancel();}pthread_exit(NULL);
}
int main()
{pthread_t pth;//创建线程pthread_create(&pth,NULL,fun.NULL);sleep(5);//杀死fun线程。pthread_cancel(pth);pthread_exit(NULL);
}
注意:被pthread_cancel杀死的线程,不属于正常退出,它会返回一个宏PTHREAD_CANCELED,这个宏可以被pthread_join(),线程回收函数所接收。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
