linux下pthread_cancel无法取消线程的原因


一个线程能够调用pthread_cancel终止同一进程中的还有一个线程,可是值得强调的是:同一进程的线程间,pthread_cancel向还有一线程发终止信号。系统并不会立即关闭被取消线程,仅仅有在被取消线程下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检測是否须要取消当前线程。被取消的线程,退出值。定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1。

#include <pthread.h>

int pthread_cancel(pthread_t thread);

看以下程序:

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
void *thread_fun(void *arg)
{
	int i=1;
	printf("thread start \n");
	while(1)
	{
		i++;
	}
	return (void *)0;
}
int main()
{
	void *ret=NULL;
	int iret=0;
	pthread_t tid;
	pthread_create(&tid,NULL,thread_fun,NULL);
	sleep(1);
	
	pthread_cancel(tid);//取消线程
	pthread_join(tid, &ret);
	printf("thread 3 exit code %d\n", (int)ret);
	
	return 0;
	
}


会发现程序再一直执行。线程无法被取消,究其原因pthread_cancel向还有一线程发终止信号。系统并不会立即关闭被取消线程,仅仅有在被取消线程下次系统调用时,才会真正结束线程。

假设线程里面没有执行系统调用。能够使用pthread_testcancel解决。

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
void *thread_fun(void *arg)
{
	int i=1;
	printf("thread start \n");
	while(1)
	{
		i++;
		pthread_testcancel();
	}
	return (void *)0;
}
int main()
{
	void *ret=NULL;
	int iret=0;
	pthread_t tid;
	pthread_create(&tid,NULL,thread_fun,NULL);
	sleep(1);
	
	pthread_cancel(tid);//取消线程
	pthread_join(tid, &ret);
	printf("thread 3 exit code %d\n", (int)ret);
	
	return 0;
	
}



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM