• 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 
    ");
    	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
    ", (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 
    ");
    	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
    ", (int)ret);
    	
    	return 0;
    	
    }
    


  • 相关阅读:
    Android 如何在自己的应用中模拟Home键
    ComboBox添加Item
    修复JSCRIPT
    几天没用TFS!挂了!
    简单的上传图片并生成缩略图
    上传图片时中文路径的问题
    获取DataList和Repeater里的控件
    MIME 类型列表
    STL注意
    MFC下的MessageBox使用_附带CBUTTON
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6984516.html
Copyright © 2020-2023  润新知